我尝试在SSM框架中的前后端使用json进行交互, 前后端使用ajax来发送;
但是在交互中出现HTTP415错误 显示Unsupported media type
原因是在request中我选择的content-type
是application/json
然而response的content-type
的类型是text/html
认真搞了一天终于找到了解决方案:
首先在maven中引入jackson包:
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-annotationsartifactId>
<version>2.9.5version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-coreartifactId>
<version>2.9.5version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
<version>2.9.5version>
dependency>
然后在Spring-mvc的配置文件中把annotation改为:
<mvc:annotation-driven >
<mvc:message-converters>
<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
<list>
<value>text/html;charset=UTF-8value>
<value>application/json;charset=UTF-8value>
list>
property>
bean>
<bean id="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8value>
<value>application/json;charset=UTF-8value>
list>
property>
bean>
mvc:message-converters>
mvc:annotation-driven>
设置为支持application/json
类型就可以正常接收啦
这里注意一个东西, 在有些方法中会通过在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
<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