SpringBoot中Jackson反序列化eBookReference属性为null的问题求助
问题分析与解决方案
问题重现
SpringBoot接口接收JSON请求时,eBookReference字段始终无法正确赋值(值为null),但将属性名改为electronicBookReference后可正常接收数据。相关代码如下:
Controller代码
@RestController @RequestMapping("/api/book") @Slf4j public class BookController { @PostMapping("/create") public ResponseEntity<String> createBook(@RequestBody BookCreationPayload payload) { log.info(payload.getName()); log.info(payload.getAuthor()); log.info(payload.getEBookReference()); return ResponseEntity.ok().body("Created successfully!"); } }
Payload实体类
@Data public class BookCreationPayload { private String name; private String author; private String eBookReference; }
请求体
{ "name":"Kafka on the Shore", "author": "Haruki Murakami", "eBookReference": "https://www.pdfdrive.com/kafka-on-the-shore-e191718472.html" }
原因分析
问题出在JavaBean规范与Jackson属性匹配规则的冲突:
- Lombok的
@Data注解遵循JavaBean规范生成getter/setter方法:对于属性eBookReference,生成的getter为getEBookReference()。 - Jackson默认通过getter/setter方法推断属性名,按照JavaBean规范,当getter方法名去掉
get前缀后,剩余部分(EBookReference)的前两个字符均为大写,Jackson会直接将其作为属性名(即EBookReference)。 - 请求JSON中的字段名是
eBookReference(首字母小写),与Jackson推断出的属性名EBookReference不匹配,因此无法完成赋值,最终字段值为null。
而属性electronicBookReference生成的getter是getElectronicBookReference(),去掉get前缀后为ElectronicBookReference,首字母大写、第二个字母小写,Jackson会将首字母转为小写得到electronicBookReference,与JSON字段名一致,因此可以正常赋值。
解决方案
方案1:使用@JsonProperty显式指定字段映射
在实体类属性上添加@JsonProperty注解,明确指定对应的JSON字段名,跳过Jackson的自动推断:
@Data public class BookCreationPayload { private String name; private String author; @JsonProperty("eBookReference") private String eBookReference; }
方案2:修改属性命名,避免特殊驼峰格式
调整属性名,避免第一个小写字母后紧跟大写字母的命名方式,比如改为ebookReference或e_book_reference(需对应调整JSON字段名):
@Data public class BookCreationPayload { private String name; private String author; // 对应JSON字段改为"ebookReference" private String ebookReference; }
方案3:配置Jackson命名策略,调整匹配规则
通过SpringBoot配置文件修改Jackson的属性命名策略,使其忽略大小写进行匹配,例如在application.yml中添加:
spring: jackson: mapper: accept-case-insensitive-properties: true
此配置允许Jackson忽略属性名的大小写进行匹配,可解决当前字段名不匹配的问题,但会影响全局的属性映射规则,需谨慎使用。
内容的提问来源于stack exchange,提问作者jerriestjerry137
相关产品推荐
相关产品推荐

