该文章 实现 返回前端时,实体类加自定义注解 把敏感词替换成 *
注解作用:
@JacksonAnnotationsInside是一个Jackson注解,用于指示在序列化和反序列化JSON时,只处理当前类的注解,而不处理继承自父类的注解。它通常与@JsonSerialize、@JsonDeserialize等注解一起使用。
@JsonSerialize注解表明该注解用于序列化操作。
using属性指定了序列化器类DictDataJsonSerializer1,该类需要实现JsonSerializer接口并重写serialize方法来定义如何将对象序列化为JSON格式。
通过使用这个注解,当Java对象被序列化为JSON时,会使用DictDataJsonSerializer1类中定义的序列化逻辑来转换对象为JSON格式。
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD})
@JacksonAnnotationsInside
@JsonSerialize(using = DictDataJsonSerializer1.class)
public @interface SensitiveWordReplace {
}
@Slf4j
public class DictDataJsonSerializer1 extends JsonSerializer<String> implements ContextualSerializer {
@Override
public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
try {
// 利用hutool的敏感词工具类 利用的算法是 dfa
// 敏感词库是否初始化
boolean inited = SensitiveUtil.isInited();
System.out.println("inited ==================" + inited);
if (!inited){
// 初始化敏感词库 实际利用注解初始化 敏感词库 这里简单写死
List tree1 = new ArrayList<String>();
tree1.add("集");
SensitiveUtil.init(tree1);
}
// 敏感词替换成 *
String value1 = SensitiveUtil.sensitiveFilter(value, false, new SensitiveProcessor() {
@Override
public String process(FoundWord foundWord) {
int length = foundWord.getFoundWord().length();
StringBuilder sb = new StringBuilder(length);
for (int i = 0; i < length; i++) {
sb.append("*");
}
return sb.toString();
}
});
if (StrUtil.isNotEmpty(value1)){
gen.writeString(value1);
}else {
gen.writeString(value);
}
} catch (BeansException e) {
gen.writeString(value);
}
}
@Override
public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
SensitiveWordReplace annotation = property.getAnnotation(SensitiveWordReplace.class);
// 满足这里 return 才会执行上面 serialize 方法
if (Objects.nonNull(annotation) && Objects.equals(String.class, property.getType().getRawClass())) {
return this;
}
return prov.findValueSerializer(property.getType(), property);
}
}
// 实体类
public class SysDept extends TreeEntity<SysDept> implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 部门ID
*/
@ApiModelProperty(value = "部门id")
@TableId(value = "dept_id")
private Long deptId;
/**
* 部门名称
*/
@SensitiveWordReplace
@ApiModelProperty(value = "部门名称")
@NotBlank(message = "部门名称不能为空")
@Size(min = 0, max = 30, message = "部门名称长度不能超过30个字符")
private String deptName;
}
测试结果:
大集团公司 ,集为敏感词 替换成 *
{"code": 200,
"msg": "操作成功",
"data": [
{
"searchValue": null,
"createBy": "admin",
"createTime": "2022-04-16 08:26:53",
"updateBy": "admin",
"updateTime": "2023-06-27 10:01:32",
"params": {
},
"interfaceType": null,
"businessNum": null,
"parentName": null,
"parentId": 0,
"children": [
],
"deptId": 100,
"deptName": "大*团公司",
"orderNum": 0,
"leader": "admin",
"phone": "1588881001313",
"email": "ry123s231@qq.com",
"status": "0",
"delFlag": "0",
"ancestors": "0"
}]
}