[英]Spring MVC and jquery post request with array of POJO
我有一个简单的POJO Java类(未显示getter和setter)
public class VacationInfo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Temporal(TemporalType.TIMESTAMP)
private Date vacationFrom;
@Temporal(TemporalType.TIMESTAMP)
private Date vacationTo;
,Spring MVC控制器的下一种方法
@RequestMapping(value = "updateVacations", method = RequestMethod.POST)
public String updateVacations(@RequestParam VacationInfo[] vacationInfos) {
...
}
和jQuery发布请求
$.ajax({
type: "POST",
url: "updateVacations",
dataType: 'json',
data: vacationInfos
});
其中“ vacationInfos”是带有JSON对象的数组,这些对象表示VacationInfo类:
[
{
vacationFrom: "01-01-2013",
vacationTo: "01-01-2013"
},
{
vacationFrom: "01-01-2013",
vacationTo: "01-01-2013"
}
]
但是当我请求时-我收到了HTTP 400错误。
jQuery方法::
$('#testButton').click(function(){
var testList= [];
$('.submit').filter(':checked').each(function() {
var checkedFrom= $(this).closest('form');
var testPojo= checkedFrom.serializeObject();
testList.push(testPojo);
});
$.ajax({
'type': 'POST',
'url':"testMethod",
'contentType': 'application/json',
'data': JSON.stringify(testList),
'dataType': 'json',
success: function(data) {
if (data == 'SUCCESS')
{
alert(data);
}
else
{
alert(data);
}
}
});
});
而jquery提供了两个级别的序列化,如serialize()和serializeArray()。但这是用于序列化一个的定制方法
用户定义的对象。
$.fn.serializeObject = function() {
var o = {};
var a = this.serializeArray();
$.each(a, function() {
if (o[this.name]) {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
}
});
return o;
};
在弹簧控制器中
@RequestMapping(value = "/testMethod", method = RequestMethod.POST)
public @ResponseBody ResponseStatus testMethod(HttpServletRequest request,
@RequestBody TestList testList)
throws Exception {
..............
}
其中TestList是另一个类,用于处理带有MVC控制器中用于测试方法的Test数组的表单发布
public class TestList extends ArrayList<Test> {}
尝试使用@RequestBody
而不是@RequestParam
@RequestMapping(value = "updateVacations", method = RequestMethod.POST)
public String updateVacations(@RequestBody VacationInfo[] vacationInfos) {
...
}
@RequestBody
方法参数注释表示方法参数应绑定到HTTP请求正文的值,在您的情况下为HTTP数据。
我回答了我的问题。 表单客户端我发送日期作为时间戳。 因为服务器不应该知道客户端在哪个时区,也不应该依赖于特定的日期格式(这是最佳做法之一)。 之后,我在VacationInfo日期字段上添加了JsonDeserializer注释,这是可行的。
public class VacationInfo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@JsonDeserialize(using=DateDeserializer.class)
@Temporal(TemporalType.TIMESTAMP)
private Date vacationFrom;
@JsonDeserialize(using=DateDeserializer.class)
@Temporal(TemporalType.TIMESTAMP)
private Date vacationTo;
Ajax POST请求
[
{
vacationFrom: "1359197567033",
vacationTo: "1359197567043"
},
{
vacationFrom: "1359197567033",
vacationTo: "1359197567043"
}
]
如果您需要以特定格式(例如“ mm-dd-yyyy”)以字符串形式发送Date-您需要定义自己的JsonDesiarilizer( Jackson中的 org.codehaus.jackson.map包)类,该类扩展了frpm JsonDeserializer类并实现你的逻辑。
您可以创建自己的格式化程序来解析传入的请求。 在这里阅读。 下面的代码略有修饰。
public class LinkFormatter implements Formatter<List<Link>> {
@Override
public List<Link> parse(String linksStr, Locale locale) throws ParseException {
return new ObjectMapper().readValue(linksStr, new TypeReference<List<Link>>() {});
}
}
jQuery:
$.ajax({
type: "POST",
data: JSON.stringify(collection)
...
});
弹簧控制器:
@RequestParam List<Link> links
并且不要忘记在应用程序上下文中注册它:
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="formatters">
<set>
<bean class="LinkFormatter"/>
</set>
</property>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.