/**
* 数据脱敏序列化器
*
* @author futaosmile@gmail.com
* @date 2022/7/18
* @since 2022/7/18
*/@Slf4jpublicclassDesensitizationSerializerextendsStdSerializer<String>implementsContextualSerializer{privatetransientDesensitizationProcessor desensitizationProcessor;protectedDesensitizationSerializer(){// 支持的类型super(String.class);}/**
* 创建上下文信息
*
* @param prov Serializer provider to use for accessing config, other serializers
* @param property Method or field that represents the property
* (and is used to access value to serialize).
* Should be available; but there may be cases where caller can not provide it and
* null is passed instead (in which case impls usually pass 'this' serializer as is)
* @return
*/@OverridepublicJsonSerializer<String>createContextual(SerializerProvider prov,BeanProperty property){DesensitizationAnn desensitizationAnn = property.getAnnotation(DesensitizationAnn.class);if(desensitizationAnn !=null){Class<?extendsDesensitizationProcessor> value = desensitizationAnn.value();DesensitizationProcessor curDesensitizationProcessor =DesensitizationProcessorFactory.getDesensitizationProcessor(value);
log.debug("cur processor is:{}", curDesensitizationProcessor);if(curDesensitizationProcessor ==null){
log.error("无法获取{}对应的processor实例", value);}else{this.desensitizationProcessor = curDesensitizationProcessor;}}returnthis;}@Overridepublicvoidserialize(String value,JsonGenerator gen,SerializerProvider provider)throwsIOException{
log.debug("cur obj is:{}",this);if(this.desensitizationProcessor !=null){try{
gen.writeObject(desensitizationProcessor.desensitize(value));}catch(Exception e){
log.error("自定义脱敏处理器数据脱敏失败", e);
gen.writeObject(value);}}else{
gen.writeObject(value);}}}