1:自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveSerialize.class)
public @interface Sensitive {
SensitiveTypeEnum type();
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 com.thk.utils.SensitiveUtils;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import java.io.IOException;
import java.util.Objects;
public class SensitiveSerialize extends JsonSerializer implements ContextualSerializer {
private SensitiveTypeEnum type;
public void serialize(final String originStr, final JsonGenerator jsonGenerator,
final SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeString( SensitiveUtils.chineseName(originStr));
jsonGenerator.writeString(SensitiveUtils.mobilePhone(originStr));
jsonGenerator.writeString(SensitiveUtils.email(originStr));
jsonGenerator.writeString(SensitiveUtils.password(originStr));
jsonGenerator.writeString(SensitiveUtils.key(originStr));
throw new IllegalArgumentException("未定义的敏感信息枚举类" + 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 = beanProperty.getAnnotation(Sensitive.class);
sensitive = beanProperty.getContextAnnotation(Sensitive.class);
return new SensitiveSerialize(sensitive.type());
return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);
return serializerProvider.findNullValueSerializer(null);
3:脱敏类型枚举类
public enum SensitiveTypeEnum {
4:使用方法,用在实体类上,对昵称,邮箱,电话,进行脱敏处理
@NotNull(message = "id不能为空")
@Sensitive(type = SensitiveTypeEnum.CHINESE_NAME)
@Sensitive(type = SensitiveTypeEnum.EMAIL)
@Sensitive(type = SensitiveTypeEnum.MOBILE_PHONE)
private String phonenumber;
5:postman测试
