Spring中@RequestBody无法识别大写属性名及返回格式问题
解决方案
问题根源
Spring默认使用Jackson处理JSON序列化/反序列化,Jackson默认的命名策略会将JavaBean的getter/setter方法名(如getUSERNAME())转换为驼峰或小写的JSON键名,和你要求的全大写键名不匹配,导致请求无法绑定、响应格式不符合要求。
方法1:给实体类属性添加@JsonProperty注解
直接指定JSON字段与实体类属性的映射关系,不受getter/setter命名影响,是最直接的解决方案。
示例实体类:
import com.fasterxml.jackson.annotation.JsonProperty; public class BusinessEntity { @JsonProperty("USER_ID") private String USER_ID; @JsonProperty("ORDER_NO") private String ORDER_NO; // 保持封装性,使用正常的getter/setter(命名不影响映射) public String getUSER_ID() { return USER_ID; } public void setUSER_ID(String USER_ID) { this.USER_ID = USER_ID; } public String getORDER_NO() { return ORDER_NO; } public void setORDER_NO(String ORDER_NO) { this.ORDER_NO = ORDER_NO; } }
- 请求时,Postman发送的JSON键(如
USER_ID)会直接映射到对应属性 - 响应时,输出的JSON键也会保持全大写格式
方法2:全局配置Jackson,统一使用原样命名策略
如果项目中有大量全大写属性的实体类,推荐全局配置,避免重复添加注解。
Spring Boot配置方式(两种任选其一)
- 配置类方式:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.PropertyNamingStrategy; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JacksonGlobalConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); // 启用IDENTITY策略:实体类属性名与JSON键名完全一致 mapper.setPropertyNamingStrategy(PropertyNamingStrategy.IDENTITY); return mapper; } }
- application.yml配置方式:
spring: jackson: property-naming-strategy: IDENTITY
配置后,实体类无需额外注解,只要属性是全大写,JSON的请求/响应键就会自动保持全大写。
方法3:结合Lombok使用(若项目用Lombok简化代码)
如果用@Data注解生成getter/setter,默认会生成驼峰命名的方法,需要配合@JsonProperty或调整Lombok配置:
方式A:配合@JsonProperty
import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import lombok.Setter; @Getter @Setter public class BusinessEntity { @JsonProperty("USER_ID") private String USER_ID; @JsonProperty("ORDER_NO") private String ORDER_NO; }
方式B:配置Lombok生成与属性名一致的getter/setter
import lombok.Data; import lombok.experimental.Accessors; @Data @Accessors(fluent = true) public class BusinessEntity { private String USER_ID; private String ORDER_NO; }
这种方式生成的getter是USER_ID()、setter是USER_ID(String userId),配合Jackson的IDENTITY策略即可正常映射,但注意这种写法不符合标准JavaBean规范,需根据项目情况选择。
内容的提问来源于stack exchange,提问作者To Nam Truong
相关产品推荐
相关产品推荐

