Spring表单对象绑定,正常提交时工作。但是如何转换为json并使用ajax

时间:2011-09-22 09:31:48

标签: java ajax json spring

我提交给控制器的表格工作正常,控制器签名:

@RequestMapping(value = "/Save", method = RequestMethod.POST)
public ModelAndView save(@ModelAttribute MyDTO myDTO) {}

我有另一个控制器方法来处理带有此签名的ajax请求:

@RequestMapping(value = "/Preview", method = RequestMethod.POST)
public ModelAndView preview(@RequestBody MyDTO myDTO) {}

但是,提交序列化表单会返回以下错误:org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "myList[0]" (Class myPackage.dto.MyDTO), not marked as ignorable

javascript / jquery是:

var json = jq("#dtoForm").serializeObject();
json = JSON.stringify(json);
jq.ajax({
        cache:false,
    type: 'POST',
    url: "${Preview}",
    data:json,
    contentType: "application/json",
    success:  function(data) {          
        previewDialog.html(data);
        previewDialog.dialog('open');
        }
});

我错过了什么?我很困惑,因为当没有转换json时,表单提交正确(dto正确映射)。除其他外,dto包含一个列表。

修改如果我按照springsource的建议删除了json = JSON.stringify(json);我得到了一个稍微不同的错误(dto中的一个字段称为“标题”):

org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Unrecognized token 'til': was expecting 'null', 'true' or 'false'

1 个答案:

答案 0 :(得分:0)

如果其他人有同样的问题,我从这里得到了代码:http://code.google.com/p/form2js/ 包含了libs,并将我的代码更改为:

var json = jq("#dtoForm").toObject(); //the new lib I dl'd from link
json = JSON.stringify(json);
...
//and then to do the same ajax call

但是,它并没有完全解决,因为spring-mvc表单为每个复选框创建了一个隐藏的表单元素,然后我手动删除:

delete json._MyBoolean;

一个旁注,这一切看起来都很混乱 - 不应该spring / jackson能够将pojo的转换为html形式和json在两个方向上没有所有这些额外的东西

(原始堆栈参考库是here