SSM中前后端使用json交互时遇到HTTP 415错误 不支持的媒体类型(Unsupported media type)

时间:2024-03-29 07:25:26

我尝试在SSM框架中的前后端使用json进行交互, 前后端使用ajax来发送;

但是在交互中出现HTTP415错误 显示Unsupported media type

原因是在request中我选择的content-typeapplication/json
然而response的content-type的类型是text/html

认真搞了一天终于找到了解决方案:

首先在maven中引入jackson包:

    <!-- jackson -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.9.5</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.5</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.5</version>
    </dependency>

然后在Spring-mvc的配置文件中把annotation改为:

<mvc:annotation-driven >
        <mvc:message-converters>
            <!-- 设置返回字符串编码 -->
            <bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name = "supportedMediaTypes">
                    <list>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
            <!-- json转换器 -->
            <bean id="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

设置为支持application/json类型就可以正常接收啦
SSM中前后端使用json交互时遇到HTTP 415错误 不支持的媒体类型(Unsupported media type)

这里注意一个东西, 在有些方法中会通过在spring中配置AnnotationMethodHandlerAdapter来解决这个问题, 但是似乎这个类已经在spring5中废弃了;

但这里要注意的是,在Spring版本中有一些重要变化。作为DefaultAnnotationHandlerMapping,AnnotationMethodHandlerAdapter或AnnotationMethodHandlerExceptionResolver的处理程序适配器自Spring 3.2版本以来已经废弃,在Spring4.x里还可以看到,在Spring5内已经删除掉了,替代品为RequestMappingHandlerMapping,RequestMappingHandlerAdapter和ExceptionHandlerExceptionResolver。通过这些新类以便于自定义映射。另外,通过在since 3.1 版本中org.springframework.web.method.HandlerMethod类中引入,来将所处理的对象转换为其方法表示。我们可以通过这个方法来判断对象返回的类型或者哪些参数是我们所期望的(看着拗口的话请打开源码查看此类注释)。

然后附上前后端的部分代码:
前端


前端:
```html
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>用AJAX以JSON方式提交数据</title>
    <script type="text/javascript" src="jquery.min.js"></script>
</head>
<body>
<form >
    id:<input type="text" id="id" value="123" /><br/>
    名称:<input type="text" id="name" value="category xxx"/><br/>
    <input type="button" value="提交" id="sender">
</form>
<div id="messageDiv"></div>

<script>
    $('#sender').click(function(){
        var id=document.getElementById('id').value;
        var name=document.getElementById('name').value;
        var category={"name":name,"id":id};
        var jsonData = JSON.stringify(category);
        var page="submitCategory";

        $.ajax({
            type:"post",
            url: page,
            data:jsonData,
            dataType:"json",
            contentType : "application/json;charset=UTF-8",
            success: function(result){
            }
        });

    });
</script>
</body>

</html>

后端:

package Controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import pojo.Category;

@Controller
@RequestMapping("")
public class CategoryController {
    @ResponseBody
    @RequestMapping("/submitCategory")
    public String submitCategory(@RequestBody Category category) {
        System.out.println("SSM接受到浏览器提交的json,并转换为Category对象:" + category);
        return "ok";
    }
}

参考文章:
SpringMVC @ResponseBody 415错误处理

Spring5源码解析-Spring中的处理器handlers

spring5.0.7.RELEASE配置jackson2.9.5