REST请求JSON Payload大小写保留问题求助
别慌,这种情况我碰到过好多次,大概率是全局序列化配置覆盖了你的@JsonProperty注解,或者是序列化库的配置/注解使用出了问题。下面分几种常见场景给你针对性解决方案:
1. 检查Jackson全局配置是否强制小写
如果用的是Spring Boot(大概率是),默认用Jackson做序列化。如果项目里配置了全局的小写命名策略,会直接覆盖@JsonProperty的自定义设置。
比如你在application.properties/application.yml里加了这类配置:
# 强制所有字段转小写 spring.jackson.property-naming-strategy=LOWER_CASE # 或者驼峰转下划线的配置(也可能干扰自定义命名) spring.jackson.property-naming-strategy=SNAKE_CASE
解决思路:
- 要么删掉这个全局配置,让
@JsonProperty注解生效; - 要么针对单个实体类单独设置命名策略,用
@JsonNaming覆盖全局:
import com.fasterxml.jackson.databind.annotation.JsonNaming; import com.fasterxml.jackson.databind.PropertyNamingStrategies; // 用默认策略,让字段上的@JsonProperty优先生效 @JsonNaming(PropertyNamingStrategies.DefaultStrategy.class) public class YourRequestEntity { @JsonProperty("UserName") // 这里的大小写会被严格保留 private String userName; // 其他字段... }
2. 确认@JsonProperty的包导对了
很多人会踩这个坑!Jackson的@JsonProperty是com.fasterxml.jackson.annotation.JsonProperty,不是Gson、JAXB等其他库的同名注解。如果导错了包,注解根本不会起作用。
检查你的实体类:
// 正确的包路径 import com.fasterxml.jackson.annotation.JsonProperty; public class YourRequestEntity { @JsonProperty("UserName") private String userName; }
3. 如果用的是Gson而非Jackson
如果项目用Gson做序列化,@JsonProperty是无效的,得用Gson专属的@SerializedName注解:
import com.google.gson.annotations.SerializedName; public class YourRequestEntity { @SerializedName("UserName") private String userName; }
同时要确保Gson没有全局强制小写的配置,比如创建Gson实例时不要加setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)这类代码。
4. 检查请求发送工具的序列化配置(比如RestTemplate)
如果用Spring的RestTemplate发送请求,默认用Jackson,但如果自定义了消息转换器,可能不小心配置了全局命名策略。比如:
RestTemplate restTemplate = new RestTemplate(); MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); ObjectMapper objectMapper = new ObjectMapper(); // 别加这行!它会强制所有字段转小写,覆盖注解 // objectMapper.setPropertyNamingStrategy(PropertyNamingStrategies.LOWER_CASE); converter.setObjectMapper(objectMapper); restTemplate.getMessageConverters().add(converter);
把全局命名策略的配置删掉,@JsonProperty就能正常生效了。
5. 极端情况:getter/setter方法干扰序列化
有时候Jackson会根据getter方法的名称生成字段名,而不是直接用字段名。比如字段是userName,但getter写成了getusername()(全小写),Jackson可能会生成username而不是你注解指定的UserName。
解决办法:
- 确保getter/setter的命名符合规范,或者在字段和getter/setter上都标注
@JsonProperty:
@JsonProperty("UserName") private String userName; @JsonProperty("UserName") public String getUserName() { return userName; } @JsonProperty("UserName") public void setUserName(String userName) { this.userName = userName; }
试试上面这些方法,应该能解决你的问题。如果还是不行,可以把实体类代码和请求发送的代码贴出来,我再帮你排查~
内容的提问来源于stack exchange,提问作者Moni

