You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无需注解通过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'
      }
      
  • 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
      

内容的提问来源于stack exchange,提问作者Stefan Feuerhahn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:45:03