Lombok 与 Jackson 注解详解(基础 + 深入)
Lombok 与 Jackson 注解详解(基础 + 深入)
✅ 一、完整示例类
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class User {private String name;private Integer age;private List<String> roles;
}
🪧 二、Lombok 注解详解
1. @Data
📌 作用
自动为类生成:
- getter/setter 方法
- toString() 方法
- equals() 和 hashCode() 方法
- requiredArgsConstructor 构造器(为 final 字段或 @NonNull 字段生成构造器)
📌 示例
@Data
public class User {private String name;private int age;
}
等价于
public class User {private String name;private int age;public String getName() { return name; }public void setName(String name) { this.name = name; }public int getAge() { return age; }public void setAge(int age) { this.age = age; }@Overridepublic boolean equals(Object o) { ... }@Overridepublic int hashCode() { ... }@Overridepublic String toString() { ... }
}
2. @Builder
📌 作用
实现 Builder 模式,用于优雅地构造对象,特别适合字段多的类,避免构造函数参数混乱。
📌 示例
@Builder
public class User {private String name;private int age;
}
构建对象
User user = User.builder().name("Tom").age(25).build();
注意:默认 @Builder 生成的是 静态内部类,使用 类名.builder() 调用构建器。
3. @NoArgsConstructor / @AllArgsConstructor
- 提供无参和全参构造器
- 可自定义访问级别:
@NoArgsConstructor(access = AccessLevel.PROTECTED)
🧩 三、Jackson 注解详解
1. @JsonInclude
控制字段序列化:
@JsonInclude(JsonInclude.Include.NON_NULL)
Include 枚举值
值 | 说明 |
---|---|
ALWAYS | 默认行为,全部序列化 |
NON_NULL | 排除 null |
NON_EMPTY | 排除 null、空字符串、空集合 |
NON_DEFAULT | 排除默认值 |
2. @JsonIgnore / @JsonProperty
@JsonIgnore
:排除字段@JsonProperty("json_name")
:重命名字段
⚠️ 四、Lombok + Jackson 协同注意事项
问题1:@Builder 不能反序列化
Jackson 不知道如何用 Builder 构造对象
解决方案:
@JsonDeserialize(builder = User.UserBuilder.class)
public class User {}@JsonPOJOBuilder(withPrefix = "")
public static class UserBuilder {}
问题2:默认值失效
默认值不会保留
解决方案:
@Builder.Default
private String name = "default";
📊 五、Jackson 全局配置
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
✅ 六、推荐组合模板
用途 | Lombok 注解 | Jackson 注解 |
---|---|---|
通用 DTO | @Data + @NoArgsConstructor + @AllArgsConstructor | @JsonInclude(NON_NULL) |
构建器对象 | @Data + @Builder + @AllArgsConstructor + @NoArgsConstructor | @JsonInclude(NON_NULL) + @JsonDeserialize |
只读模型 | @Getter + @AllArgsConstructor | @JsonProperty(access = READ_ONLY) |
精准序列化控制 | - | @JsonInclude(NON_EMPTY) + @JsonIgnore + @JsonProperty |
📘 七、延伸学习建议
方向 | 推荐 |
---|---|
Lombok 原理 | 查看 lombok.transform AST 生成逻辑 |
Jackson 核心 | 阅读 BeanPropertyWriter 与序列化引擎 |
实战练习 | Spring Boot 中编写 DTO + JSON 接口 |