spring接收json参数出现HTTP Status 415错误解决

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>

填坑之路

  1. 首先检查是否配置了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数据。

总结

  1. spring底层采用jackson对json进行处理。因为我不喜欢用jackson所以出现上面的错误。
  2. springMVC接收前端json使用@RequestBody注解,使用该注解须注意配置注解驱动 <mvc:annotation-driven/>
  3. spring接收json更多方式请参照zzsuje博客
  4. 前端传递json到后端须设置请求头contentType:"application/json"和数据类型dataType:"json"若有中文还需在请求头中加charset=utf-8

猜你喜欢

转载自www.cnblogs.com/junlinsky/p/12934642.html