Spring接口中@RequestBody失效致请求对象字段为空的解决方法
看起来你碰到了Spring里@RequestBody没法正确把请求体绑定到对象的麻烦——不管是RAML生成的代码还是手动写的测试都出现这个情况,我来帮你梳理几个常见的排查方向和解决办法:
1. 先确认请求的Content-Type是否正确
Spring的@RequestBody默认只处理Content-Type: application/json的请求。如果你的请求头没设置这个,或者错设成了application/x-www-form-urlencoded这类格式,Spring就不会用Jackson去解析JSON请求体,自然会导致对象字段为空。
解决办法:
发送请求时一定要带上这个请求头:
Content-Type: application/json
用Postman测试的话,直接在Headers面板里添加这个键值对就行。
2. 检查请求体字段名和实体类是否匹配
你的实体类字段是insurerID(驼峰式,末尾是大写ID),如果请求体里写成了insurerId(小写id)或者insurer_id(下划线分隔),Jackson默认不会自动映射,结果就是字段为空。
正确的请求体示例:
{ "insurerID": "your-insurer-id-value" }
如果想支持下划线转驼峰的格式,可以给字段加@JsonProperty注解:
@JsonProperty("insurer_id") private String insurerID;
或者在Spring Boot的配置文件里全局设置Jackson的命名策略(比如application.yml):
spring: jackson: property-naming-strategy: SNAKE_CASE
3. 确认Jackson依赖是否存在
如果是Spring Boot项目,spring-boot-starter-web已经包含了Jackson相关依赖,不用额外加。但如果是普通Spring MVC项目,得手动引入Jackson依赖:
Maven依赖:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> <!-- 用最新稳定版即可 --> </dependency>
Gradle依赖:
implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.2'
4. 排查请求体的JSON格式是否正确
如果请求体的JSON有语法错误——比如少了引号、逗号不匹配、括号没闭合,Jackson解析失败后也会返回字段为空的对象。可以用JSON校验工具(比如JSONLint)检查下请求体的格式是否合法。
5. 检查实体类的无参构造和setter
你的实体类已经有了无参构造和正确的setter方法,这部分是没问题的,但要记住:Jackson默认需要无参构造来实例化对象,如果后续修改构造方法时删掉了无参构造,也会导致解析失败。
6. 确认Spring的MessageConverter配置没被覆盖
如果你的项目自定义了HttpMessageConverter,有可能覆盖了默认的Jackson转换器,导致无法解析JSON。检查下配置类里有没有类似这样的代码,确保保留了Jackson的转换器:
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { // 一定要添加这个Jackson转换器,不然JSON解析会失效 converters.add(new MappingJackson2HttpMessageConverter()); // 其他自定义转换器可以加在这里 } }
建议你先从最常见的前两点入手排查:先确认请求头的Content-Type,再核对请求体的字段名和实体类是否一致,这两个是最容易踩坑的地方。
内容的提问来源于stack exchange,提问作者Evgenii Olenskii

