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
相关产品推荐
相关产品推荐

