({ElementType.FIELD})
(RetentionPolicy.RUNTIME)
(using = DesensitizedSerializer.class)
public @interface Desensitized {
    SensitiveTypeEnum sensitiveType() default SensitiveTypeEnum.PHONE;
}public class DesensitizedSerializer extends JsonSerializer<String> implements ContextualSerializer {
    private SensitiveTypeEnum sensitiveType;
    
    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        if (this.sensitiveType == null || StringUtils.isEmpty(value)) {
            gen.writeString(value);
            return;
        }
        switch (this.sensitiveType) {
            case NAME:
                gen.writeString(StringUtils.overlay(value, StringUtils.repeat('*', value.length() - 1), 1, value.length()));
                break;
            case ID_CARD:
                gen.writeString(StringUtils.overlay(value, "***********", 3, value.length() - 4));
                break;
            case PHONE:
                gen.writeString(StringUtils.overlay(value, "****", 3, value.length() - 4));
                break;
            default:
                break;
        }
    }
    
    public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
        if (property != null) {
            Desensitized desensitized = property.getAnnotation(Desensitized.class);
            if (desensitized == null) {
                desensitized = property.getContextAnnotation(Desensitized.class);
            }
            if (desensitized != null) {
                this.sensitiveType = desensitized.sensitiveType();
            }
        }
        return this;
    }
}                
                










