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

Spring Boot无法反序列化单属性JSON对象的异常问题咨询

问题成因

报错核心原因是Jackson无法识别你当前DTO类的构造逻辑,无法将JSON对象的字段映射到类属性上:

  • 你使用Lombok的@Value注解标记类,该注解默认生成全属性构造方法、不生成无参构造方法,而你同时使用了@Builder注解,默认情况下Jackson无法直接识别Builder模式的实例构造逻辑。
  • 未配置Jackson与Lombok的适配支持时,Jackson无法读取构造方法的参数名,无法将JSON中name字段和构造方法的name参数做匹配,因此判定当前类没有可用的对象反序列化构造器。
  • 之所以接口能直接接收裸字符串"someName",是因为Jackson找不到对象构造器时,会尝试匹配单字符串参数的委托构造逻辑,刚好命中了类隐式生成的单参数调用判定,才会出现这种不符合预期的行为。
修复方案

按以下步骤操作即可解决:

  • 确保项目引入了Jackson参数名识别模块(高版本Spring Boot引入后会自动注册,无需手动配置),Maven依赖如下:
<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-parameter-names</artifactId>
</dependency>
  • 修改DTO类,在@Builder注解旁添加Lombok提供的@Jacksonized注解,该注解会自动生成Jackson识别Builder所需的配置,适配不可变类+Builder模式的反序列化场景,修改后的类代码如下:
@Value
@Builder(toBuilder = true)
@Jacksonized
@ToString
public static class Create{
    @NotBlank(message = "Name must be filled")
    String name;
}
  • 确保项目编译时开启了Java参数元数据保留:如果你用Maven编译插件,需要在maven-compiler-plugin配置中添加-parameters编译参数,示例配置:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <parameters>true</parameters>
    </configuration>
</plugin>

如果不想修改编译参数,也可以给DTO的字段显式加上@JsonProperty("name")注解,显式声明字段和JSON属性的映射关系。

注意:不推荐通过添加@NoArgsConstructor(force = true)的方式修复,该方式会强制给final字段赋值默认null,破坏@Value注解带来的类不可变性。


内容的提问来源于stack exchange,提问作者Jakub Znamenáček

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 03:18:28