使用Spring的RequestMapping 接收一个数组,本来有一种方式,是让 客户端 发送多个同样的参数,然后服务器端就可以接收到数组了
服务器端:
@RequestMapping(value="/add",method=RequestMethod.POST)
@ResponseBody
public String addAgency(String agencyName, String [] storeNames) {
....
}
客户端:
agencyName: "agency-1"
storeNames: "store-1"
storeNames: "store-2"
但是这样写,前端的JS 有点怪怪的,最好的方式是,前端发送过来一个 Json 数据,然后后端直接接收到进行处理。 所以就有了下面的方式:
使用Spring的RequestBody 接收数据。代码如下:
服务端:
@RequestMapping(value="/add",method=RequestMethod.POST)
@ResponseBody
public String addAgency(@RequestBody BbtAgencyParamVO bbtAgencyParamVO) {
....
}
public class BbtAgencyParamVO implements Serializable{
private static final long serialVersionUID = 502698704597823067L;
private String agencyName;
private List<String> storeNames;
public String getAgencyName() {
return agencyName;
}
public void setAgencyName(String agencyName) {
this.agencyName = agencyName;
}
public List<String> getStoreNames() {
return storeNames;
}
public void setStoreNames(List<String> storeNames) {
this.storeNames = storeNames;
}
}
JS:
function addAgency(agencyName, storeName) {
var originalData = {
agencyName: agencyName,
storeNames: storeName
};
$.ajax({
url: '/agency/add.htm',
type: 'POST',
dataType: 'json',
contentType : 'application/json',
data: JSON.stringify(originalData),
success: function (data) {
if (data.resultCode == 1) {
alert('添加成功');
//window.location.reload();
}
}
});
}
但修改之后,有一个问题,就是报以下错误: 415 Unsupported Media Type
了解了之后,发现,其实是 服务器端已经收到数据了, 但是客户端传送的 contentType是: application/json,转换不成对应的Object.
原因是: Spring需要有对应的MessageConverter 对 application/json 类型的content进行转换
改进:
1. 引进 Jackson 转换类
2. 让Spring自动加载相应的 messageConverter 类
jackson 转换包:
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.4.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.4.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.4.4</version>
</dependency>
在 spring-mvc 中 添加 annotation
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"
<mvc:annotation-driven />
会自动注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter两个bean。
AnnotationMethodHandlerAdapter 将会初始化 7 个转换器,可以通过调用AnnotationMethodHandlerAdapter的getMessageConverts()方法来获取转换器的一个集合 List.
ByteArrayHttpMessageConverter
StringHttpMessageConverter
ResourceHttpMessageConverter
SourceHttpMessageConverter
XmlAwareFormHttpMessageConverter
Jaxb2RootElementHttpMessageConverter
MappingJacksonHttpMessageConverter
对于json的解析就是通过MappingJacksonHttpMessageConverter转换器完成的
In HTTP,
Content-Type is used in request and response payloads to convey the media type of the current payload.
Accept is used in request payloads to say what media types the server may use in the response payload
refer:
http://www.cnblogs.com/qq78292959/p/3761646.html
http://stackoverflow.com/questions/19396696/415-unsupported-media-type-post-json-to-odata-service-in-lightswitch-2012

本文介绍如何使用Spring MVC接收前端发送的JSON数据,并解决415 Unsupported MediaType错误。需引入Jackson依赖并配置mvc:annotation-driven。
1557

被折叠的 条评论
为什么被折叠?



