前端数据脱敏注解实际是后端序列化注解,必须设@retention(runtime)确保jackson/aop运行时读取,@target至少含field,且顶层注解须加@jacksonannotationsinside以激活嵌套序列化配置。

前端数据脱敏注解设计中,所谓“前端脱敏”实际是误解——注解(@interface)是 Java 语言特性,运行在 JVM 中,**前端浏览器无法识别、解析或执行任何 Java 注解**。真正起作用的是后端框架(如 Spring Boot + Jackson)在序列化响应时读取字段上的注解,并据此对 JSON 字段做掩码处理,再将脱敏后的数据返回给前端。因此,“前端数据脱敏注解”本质是**面向后端序列化流程的注解设计**,其元注解配置必须确保注解能被 Jackson 或 AOP 在运行时通过反射准确读取。
必须设置 @Retention(RetentionPolicy.RUNTIME)
这是最关键的元注解。若遗漏或误设为 SOURCE 或 CLASS,运行时反射将完全获取不到该注解,Jackson 序列化器或 AOP 切面会静默失效。
-
错误示例:
@Retention(RetentionPolicy.CLASS)→ 编译后字节码里有,但 Spring 启动时反射查不到,注解形同虚设 -
正确写法:
@Retention(RetentionPolicy.RUNTIME)→ 确保 Spring 容器、Jackson、AOP 均可实时读取
@Target 必须覆盖字段级使用场景
脱敏注解绝大多数用于实体类的 String 字段(如手机号、邮箱),因此 @Target 至少要包含 ElementType.FIELD。
- 常见合理组合:
@Target({ElementType.FIELD, ElementType.METHOD}) - 若只标注在 getter 方法上(配合
@JsonSerialize),则需保留METHOD;若直接标注在字段(Lombok +@Data场景更常见),则FIELD不可少 - 避免盲目加
TYPE或PARAMETER——无对应处理器时反而增加混淆
@Documented 和 @JacksonAnnotationsInside 的协同作用
这两个元注解不是“可有可无”,而是提升框架集成稳定性的关键细节:
-
@Documented:让注解出现在 Javadoc 中,便于团队理解用途,不直接影响功能,但属工程规范必备 -
@JacksonAnnotationsInside:**必须添加**在作为 Jackson 序列化入口的顶层注解上(例如@EmailDesensitize)。它告诉 Jackson:“这个注解内部已声明了@JsonSerialize,请一并处理”。没有它,Jackson 会忽略你嵌套的序列化配置
避免常见配置陷阱
- 不要用
@Inherited:字段注解无需被子类继承,加了也无效(Java 规范明确:字段/方法注解不可继承) - 不要省略
@Target:JDK 默认@Target是空集合,此时注解不能用于任何位置,编译即报错 - 不要混用多个
@JsonSerialize:一个字段只能有一个生效的序列化器。若同时存在@JsonSerialize和自定义脱敏注解,需确保后者通过@JacksonAnnotationsInside正确聚合
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











