Spring Boot项目中xId无法赋值但xxId正常的原因咨询
问题分析与解决
问题描述
在Spring Boot项目中定义了如下请求类:
package com.example.demo.demos.service; import lombok.Data; @Data public class CreateRequest { private String name; private String xId; private String xxId; }
传递的JSON参数:
{ "xId": "zzz", "xxId": "aaa", "name": "test" }
但接收后xId的值为null,打印结果:
CreateRequest(name=test, xId=null, xxId=aaa)
Controller代码:
package com.example.demo.demos.web; import com.example.demo.demos.service.CreateRequest; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController public class TestController { @PostMapping("/test") public void test(@RequestBody CreateRequest request) { System.out.println(request); } }
仅当属性首字母为小写且第二个字母为大写时出现此问题,原因是什么?
原因解析
这是Lombok生成的Getter/Setter规则与Jackson的JSON字段匹配规则冲突导致的:
- Lombok的
@Data注解生成getter时遵循JavaBean规范:对于字段xId,生成的getter方法是getXId()(首字母小写的字段,会将第一个字母转为大写后加get前缀)。 - Spring Boot默认使用Jackson处理JSON反序列化,Jackson解析getter方法的规则是:去掉
get前缀后,若剩余部分首字母大写、第二个字母小写,会将首字母转为小写作为字段名;若剩余部分前两个字母均为大写,则直接保留原名称作为字段名。 - 对于
getXId(),Jackson会解析为字段名XId(首字母大写),但传入的JSON字段是xId(首字母小写),两者不匹配,因此无法完成赋值,导致xId为null。 - 而
xxId对应的getter是getXxId(),Jackson解析时发现前两个字母都是大写,直接将字段名识别为xxId,和JSON中的字段一致,所以能正常赋值。
解决方案
可以通过以下任意一种方式解决:
- 使用
@JsonProperty注解指定字段名:
在xId字段上添加注解,明确指定JSON对应的字段名:@Data public class CreateRequest { private String name; @JsonProperty("xId") private String xId; private String xxId; } - 调整字段命名:
遵循JavaBean推荐命名规范,将xId改为xid(全小写)或者x_id(下划线分隔),这样Lombok生成的getter是getXid()或getX_id(),Jackson能正确解析为对应的JSON字段。 - 配置Jackson的匹配规则:
通过配置Jackson的MapperFeature.USE_STD_BEAN_NAMING,让其严格遵循JavaBean规范解析字段名,不过这种方式可能影响其他字段的序列化/反序列化,需谨慎使用。
内容的提问来源于stack exchange,提问作者Tony Zheng
相关产品推荐
相关产品推荐

