package com.qianwen.core.tool.senstive; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.BeanProperty; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.ContextualSerializer; import java.io.IOException; import java.util.Objects; import com.qianwen.core.tool.utils.DesensitizedUtils; public class SensitiveSerialize extends JsonSerializer implements ContextualSerializer { private SensitiveTypeEnum type; private Integer prefixNoMaskLen; private Integer suffixNoMaskLen; private String maskStr; public SensitiveSerialize() { } public SensitiveSerialize(final SensitiveTypeEnum type, final Integer prefixNoMaskLen, final Integer suffixNoMaskLen, final String maskStr) { this.type = type; this.prefixNoMaskLen = prefixNoMaskLen; this.suffixNoMaskLen = suffixNoMaskLen; this.maskStr = maskStr; } public void serialize(final String origin, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider) throws IOException { switch (this.type) { case CHINESE_NAME: jsonGenerator.writeString(DesensitizedUtils.chineseName(origin)); return; case ID_CARD: jsonGenerator.writeString(DesensitizedUtils.idCardNum(origin)); return; case FIXED_PHONE: jsonGenerator.writeString(DesensitizedUtils.fixedPhone(origin)); return; case MOBILE_PHONE: jsonGenerator.writeString(DesensitizedUtils.mobilePhone(origin)); return; case ADDRESS: jsonGenerator.writeString(DesensitizedUtils.address(origin)); return; case EMAIL: jsonGenerator.writeString(DesensitizedUtils.email(origin)); return; case BANK_CARD: jsonGenerator.writeString(DesensitizedUtils.bankCard(origin)); return; case PASSWORD: jsonGenerator.writeString(DesensitizedUtils.password(origin)); return; case KEY: jsonGenerator.writeString(DesensitizedUtils.key(origin)); return; case CUSTOMER: jsonGenerator.writeString(DesensitizedUtils.desValue(origin, this.prefixNoMaskLen.intValue(), this.suffixNoMaskLen.intValue(), this.maskStr)); return; } throw new IllegalArgumentException("Unknow sensitive type enum " + this.type); } public JsonSerializer createContextual(final SerializerProvider serializerProvider, final BeanProperty beanProperty) throws JsonMappingException { if (beanProperty != null) { if (Objects.equals(beanProperty.getType().getRawClass(), String.class)) { Sensitive sensitive = (Sensitive) beanProperty.getAnnotation(Sensitive.class); if (sensitive == null) { sensitive = (Sensitive) beanProperty.getContextAnnotation(Sensitive.class); } if (sensitive != null) { return new SensitiveSerialize(sensitive.type(), Integer.valueOf(sensitive.prefixNoMaskLen()), Integer.valueOf(sensitive.suffixNoMaskLen()), sensitive.maskStr()); } } return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty); } return serializerProvider.findNullValueSerializer((BeanProperty) null); } }