Java中可通过自定义注解配合Jackson序列化器控制字段序列化逻辑:1.定义@Retention(RUNTIME)的注解标记字段;2.编写继承JsonSerializer的处理器实现定制逻辑,如字符串脱敏。

Java 中可以通过自定义注解 + Jackson 的序列化扩展机制(如 JsonSerializer 和 @JsonSerialize )来控制字段的序列化逻辑,而不是直接在注解上写逻辑——注解本身只是标记,真正起作用的是配套的序列化器。
1. 定义自定义注解
先创建一个运行时保留的注解,用于标记需要特殊序列化的字段:
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomSerialize {
Class extends JsonSerializer>> serializer() default DefaultCustomSerializer.class;
}这里支持传入具体的序列化器类,默认用一个兜底实现。
2. 编写自定义序列化器
继承 JsonSerializer<t></t>,重写 serialize 方法。例如,对字符串字段做脱敏处理:
public class SensitiveStringSerializer extends JsonSerializer<string> {
@Override
public void serialize(String value, JsonGenerator gen, SerializerProvider serializers)
throws IOException {
if (value == null) {
gen.writeNull();
} else {
// 例如:只显示首尾字符,中间用 * 替代
String masked = value.length() </string>3. 在字段上使用注解
直接标注在目标字段上,指定对应序列化器:
public class User {
private String name;
<pre class="brush:php;toolbar:false;">@CustomSerialize(serializer = SensitiveStringSerializer.class)
private String idCard;
@CustomSerialize(serializer = SensitiveStringSerializer.class)
private String phone;
// getter/setter...}
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
4. 配置 Jackson 使用注解驱动序列化
Jackson 默认不识别自定义注解,需通过 SimpleModule 注册注解与序列化器的绑定关系,或更推荐的方式是:让注解本身携带序列化器类型,并配合自定义 Serializers 扩展点。
实际项目中常用做法是:
- 编写一个
CustomAnnotationIntrospector子类,在findSerializer方法中检查字段是否带有@CustomSerialize,并返回其serializer()指定的实例; - 将该 Introspector 设置到
ObjectMapper中:
ObjectMapper mapper = new ObjectMapper(); mapper.setAnnotationIntrospector(new CustomAnnotationIntrospector());
其中 CustomAnnotationIntrospector 示例关键逻辑:
public class CustomAnnotationIntrospector extends JacksonAnnotationIntrospector {
@Override
public Object findSerializer(Annotated annotated) {
CustomSerialize ann = annotated.getAnnotation(CustomSerialize.class);
if (ann != null) {
try {
return ann.serializer().getDeclaredConstructor().newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
return super.findSerializer(annotated);
}
}这样,只要字段加了 @CustomSerialize,Jackson 就会自动调用你指定的序列化器,无需改实体、无需重复配置。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










