Spring MVC调用返回JSON的Web服务遇400错误,如何解决?
Hey,碰到HTTP 400 Bad Request这个坑,十有八九是你的请求和后端Controller的预期不匹配导致的,我给你梳理几个最常见的原因和对应的解决办法,你可以挨个排查:
1. 请求参数与Controller接收逻辑不匹配
如果是POST请求传递JSON数据,一定要给接收参数的实体类加上@RequestBody注解,不然Spring没法自动把请求体里的JSON转换成Java对象。举个正确的Controller示例:
@PostMapping("/get-json-data") public String displayData(@RequestBody YourDataEntity data, Model model) { // 调用外部Web服务并处理数据 model.addAttribute("result", data); return "data-view"; }
另外,要确保你的Java实体类字段和JSON的key完全匹配(大小写敏感),如果JSON里的key和实体类字段名不一样,记得用@JsonProperty指定别名,比如:
public class YourDataEntity { @JsonProperty("user_nickname") private String userNickname; // JSON里的key是user_nickname,实体类是userNickname // 别忘了加getter和setter方法! public String getUserNickname() { return userNickname; } public void setUserNickname(String userNickname) { this.userNickname = userNickname; } }
2. 请求头Content-Type设置错误
前端发送请求时,必须把Content-Type设置为application/json,否则Spring无法识别请求体里的JSON格式。比如用原生JS发送请求:
fetch('/get-json-data', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({user_nickname: "rasit"}) });
如果用Postman测试,也要在Headers标签里手动添加Content-Type: application/json。
3. JSON本身存在语法错误
JSON格式要求非常严格,比如key必须用双引号包裹、逗号不能漏也不能多、括号要配对。比如下面就是错误的JSON:
{ user_nickname: "rasit", // key没加双引号 age: 25, // 多了一个逗号 }
正确的格式应该是:
{ "user_nickname": "rasit", "age": 25 }
这种语法错误会直接导致Spring解析失败,返回400错误。
4. 缺少JSON解析依赖
Spring MVC默认用Jackson来处理JSON和Java对象的转换,如果你的项目里没引入Jackson依赖,就会出现解析失败的情况。如果是Maven项目,在pom.xml里添加:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> <!-- 选择和Spring版本兼容的版本 --> </dependency>
5. 请求方法与Controller注解不匹配
比如你的Controller用的是@GetMapping,但前端发送的是POST请求;或者Controller用@PostMapping,前端却用GET传参数,这种不匹配也会触发400错误。一定要确保请求方法(GET/POST/PUT等)和Controller上的注解完全一致。
6. 路径/请求参数类型不匹配
如果用@PathVariable接收路径参数,比如:
@GetMapping("/user/{userId}") public String getUserInfo(@PathVariable Long userId, Model model) { // 处理逻辑 }
如果请求路径是/user/abc,而userId是Long类型,Spring没法把字符串"abc"转换成Long,就会返回400。这时候要确保传递的参数类型和Controller里定义的一致。
你可以先从这几个方向排查,一般都能找到问题所在~
内容的提问来源于stack exchange,提问作者rasit

