controller要接收List<myObject>之类的泛型数据,需要在springmvc中添加json相关的解析配置。
主要是添加:<bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" />
具体示例如下:
Bean - CustomInfo:
public class CustomInfo {
/* 包含一个List<CustomRule> */
private List<CustomRule> ruleList;
private List<String> objList;
private String objType;
/* getters and setters */
@Override
public String toString() {
String rule = "";
for(CustomRule cRule: ruleList) {
rule += cRule.toString() + "\n";
}
return "customRules\n" +
"ruleList=" + rule + "\n" +
"objList=" + objList.toString() + "\n" +
"objType: " + objType + "\n\n";
}
}
Bean - CustomRule
public class CustomRule {
private String metricType;
private String startDate;
private String endDate;
private String startHour;
private String endHour;
/* getters and setters */
@Override
public String toString() {
return "metricType: " + metricType +
" startHour: " + startHour +
" endHour: " + endHour +
" startDate: " + startDate +
" endDate: " + endDate;
}
}
js:
data = [
{
"objType": "testType1",
"objList": [
"obj1",
"obj2",
"obj3"
],
"ruleList": [
{
"metricType": "test1",
"startHour": "1"
}
]
},
{
"objType": "testType2",
"objList": [
"obj1",
"obj2",
"obj3"
],
"ruleList": [
{
"metricType": "test2",
"startHour": "2"
}
]
}
]
$.ajax({
url : "xxx/test",
data: JSON.stringify(data),
type : "post",
dataType : "json",
contentType: "application/json; charset=utf-8",
success: function(data) {
if (data.success == true) {
console.log(data.msg);
/* TO-DO: 跳转到定制页面 */
} else {
alert("添加失败, 失败原因: " + data.msg);
}
},
error: function (e) {
console.log(e);
}
});
controller:
@RequestMapping(value="/test", method=RequestMethod.POST)
@ResponseBody
public Json test(@RequestBody List<CustomInfo> data) {
DataSourceContextHolder.setDataSource(DataSource.dbprod_dataSource);
Json j = new Json();
try {
for (CustomInfo c: data) {
System.out.print(c.toString());
}
j.setSuccess(true);
j.setMsg("insert sucess!");
} catch (Exception e) {
System.out.println(e.toString());
j.setSuccess(false);
j.setMsg(e.getMessage());
}
return j;
}
springmvc.xml中添加以下配置:
<bean
class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="order" value="1" />
<property name="contentNegotiationManager">
<bean class="org.springframework.web.accept.ContentNegotiationManager">
<constructor-arg>
<bean
class="org.springframework.web.accept.PathExtensionContentNegotiationStrategy">
<constructor-arg>
<map>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
</map>
</constructor-arg>
</bean>
</constructor-arg>
</bean>
</property>
<property name="defaultViews">
<list>
<bean
class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" />
<bean class="org.springframework.web.servlet.view.xml.MarshallingView">
<constructor-arg>
<bean class="org.springframework.oxm.xstream.XStreamMarshaller">
<property name="autodetectAnnotations" value="true" />
</bean>
</constructor-arg>
</bean>
</list>
</property>
</bean>
我使用的是maven,需要添加以下的jar包:
<!-- JACKSON -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>4.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.7</version>
</dependency>