如何无需注解通过Jackson创建不可变DTO,Spring Boot下该如何配置?
无需注解实现Jackson反序列化不可变对象的配置方案
通用配置(编译器+Jackson基础设置)
核心原理:开启Java编译器的参数名保留开关,让字节码中存储构造方法、静态工厂方法的实际参数名,Jackson可直接读取该元数据与JSON字段匹配,无需额外添加
@JsonProperty或@ConstructorProperties注解。
- 编译器参数配置:
- 直接使用javac编译时添加参数:
javac -parameters <源文件名> - Maven项目配置:在
maven-compiler-plugin中添加编译参数:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1+</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> <compilerArgs> <arg>-parameters</arg> </compilerArgs> </configuration> </plugin> - Gradle项目配置:在
build.gradle中添加编译任务配置:compileJava { options.compilerArgs << '-parameters' }
- 直接使用javac编译时添加参数:
- Jackson基础配置:
Jackson 2.8+版本提供了ParameterNamesModule模块用于读取参数名元数据,2.10+版本默认会自动注册该模块,无需手动配置;低版本可手动注册:ObjectMapper mapper = new ObjectMapper() .registerModule(new ParameterNamesModule());
Spring Boot场景最优配置
Spring Boot 2.0+版本的Jackson自动配置默认已经完成了ParameterNamesModule等必要模块的注册,仅需做以下少量配置即可实现无注解反序列化不可变对象,无需自定义修改ObjectMapper,是侵入性最低的最优方案:
- 第一步:按照上述通用配置开启编译器的
-parameters参数 - 第二步:在
application.yml或application.properties中添加Jackson可见性配置,兼容无注解的构造函数 Creator:spring: jackson: visibility: creator: any - 可选适配配置:
- 如果你使用Java 16及以上版本的
record定义不可变对象,完成前两步即可直接使用,无需额外配置 - 如果你使用Lombok生成
@Value类型的不可变对象,在项目根目录新增lombok.config文件添加以下配置即可适配:lombok.anyConstructor.addConstructorProperties = true
- 如果你使用Java 16及以上版本的
内容的提问来源于stack exchange,提问作者Stefan Feuerhahn
相关产品推荐
相关产品推荐

