spring接收json参数出现HTTP Status 415错误解决方案
今天在使用spring接收json参数时要么接收不到参数要么就报HTTP Status 415错误。
废话不多说,先上代码
首先我的js是这样的
$.ajax({
url:"/crm/crm_login",
type:"post",
async:true,
cache:false,
contentType:"application/json;charset=utf-8",
dataType:"json",
data:JSON.stringify(JsonData),
success:function(data){
//认证完成
setTimeout(function () {
$('.authent').hide();
$('.login').removeClass('test');
if (data.Status == '200') {
//登录成功
$('.login div').fadeOut(100);
$('.success').fadeIn(1000);
$('.success').html(data.Text);
window.setTimeout(function(){
window.location.href="/crm/index"
},1000);
//跳转操作
} else {
AjaxErro(data);
}
}, 2400);
},
error:function(response){
alert("出错" + alert("数据: " + JSON.stringify(response)));
}
});
测试的json数据是这样的
{login: "admin", pwd: "123456"}
controller中处理请求的方法
@ResponseBody
@PostMapping("crm_login")
public String crm_login(@RequestBody Map<String, String> user){
System.out.println(user.toString());
Map<String, String> resultMap = new HashMap<>();
resultMap.put("Status","200"); //200是成功,允许登录
String result = JSON.toJSONString(resultMap);
return result;
}
我的pom依赖包
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.1.0</version>
<scope>compile</scope>
</dependency>
<!--数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.22</version>
</dependency>
<!--Mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
<!--Spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!-- servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
<!-- shiro-spring -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.5.3</version>
</dependency>
<!-- thymeleaf -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
</dependencies>
填坑之路
- 首先检查是否配置了springMVC的注解驱动(annotation-driven)和是否导入了头文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--这个一定要配置-->
<mvc:annotation-driven/>
<!-- 上面3个关于mvc的schema也很重要 -->
......
</beans>
经过检查这里一点问题都没有
此时我怀疑是js的问题搜了好几篇博客都说只要在ajax中加上contentType:"application/json;"即可解决
然后我检查我的js很肯定我的设置没有问题,但是还是发现了一处错误
$.ajax({
url:"/crm/crm_login",
type:"post",
async:true,
cache:false,
contentType:"application/json;charset=utf-8",
dataType:"json", //我这里的dataType原来是datatype,排查N遍之后还是被我发现了
data:JSON.stringify(JsonData),
success:function(data){
...
}
本以为问题已经得到解决,非常兴奋的测试后依然出现415
接下来几个小时不是在debug就是在搜博客
3. 最后在MyHappyLife的一篇博客上找到了思路
根据博客内容我添加了如下依赖:
<!-- jackson-mapper-asl -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
问题依然存在
此时我假设我需要jackson的依赖包
于是依次导入了如下依赖
<!-- jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.11.0</version>
</dependency>
<!--jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.0</version>
</dependency>
问题得到解决,后台输出了json数据。
总结
- spring底层采用jackson对json进行处理。因为我不喜欢用jackson所以出现上面的错误。
- springMVC接收前端json使用@RequestBody注解,使用该注解须注意配置注解驱动 <mvc:annotation-driven/>
- spring接收json更多方式请参照zzsuje博客
- 前端传递json到后端须设置请求头contentType:"application/json"和数据类型dataType:"json"若有中文还需在请求头中加charset=utf-8