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

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属性匹配规则的冲突:

  1. Lombok的@Data注解遵循JavaBean规范生成getter/setter方法:对于属性eBookReference,生成的getter为getEBookReference()。
  2. Jackson默认通过getter/setter方法推断属性名,按照JavaBean规范,当getter方法名去掉get前缀后,剩余部分(EBookReference)的前两个字符均为大写,Jackson会直接将其作为属性名(即EBookReference)。
  3. 请求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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:17:03