arc*_*don 6 java ajax json controller spring-mvc
有一个Java spring MVC web应用程序,并正在发出jquery ajax post请求.我的控制器设置为接收和发送json数据.一切正常,JSON字符串格式良好,Controller可以创建并填充Command对象,并使用JSON请求数据的内容填充它.但是,我正在更新Contact对象的数据,而我的JSP表单元素仅包含数据库更新所需的所有数据的子集.在我对具有表单的JSP页面的初始GET请求中,我从数据库中检索所有必需的数据,填充Contact Command对象,然后将该命令对象绑定到Model.
如果我正在进行正常的POST提交表单提交,我相信只是将我的命令对象声明为@SessionAttribute,并在我的onSubmit()POST方法中使用@ModelAttribute引用该Command对象就足够了.Spring将从我的会话中检索已填充的命令对象,然后绑定(覆盖)由于POST请求而更改的那些值.然后,可以将此更新的命令对象用作DB更新的参数.
但是,我正在使用Spring 3并利用@RequestBody参数类型.我无法让Spring给我会话对象并自动绑定请求中的新值.它或者只提供旧的会话命令对象(不应用更改)或仅提供POST请求中的值的新命令对象.
这是一个小代码 - 不起作用:
@SessionAttributes("contactCommand")
@Controller
public class ContactController {
@RequestMapping(value = "/editContact", method=RequestMethod.GET)
public String init(ModelMap model, Locale locale, HttpServletRequest request, HttpServletResponse response) throws GeneralException {
final ContactCommand cmd = new ContactCommand();
// populate with data from DB etc
model.addAttribute("contactCommand", cmd);
// etc
}
@RequestMapping(value="/editContact",method=RequestMethod.POST, consumes = "application/json", produces = "application/json")
public @ResponseBody Map<String, ? extends Object> editContactInfo(@RequestBody @ModelAttribute("contactCommand") ContactCommand cmd, HttpServletRequest request, HttpServletResponse response) throws GeneralException {
// do business logic with command object here
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我什么是使用@RequestBody与JSON请求数据的"标准"或"最简单"的方法,并使其绑定到现有的/ @ModelAttribute填充的Command对象,以便Command对象完全由新旧数据构成(以同样的方式使用完整的POST http提交轻松实现).
一个相关的问题是上面的代码有什么问题?@SessionAttribute和带有JSON内容的@RequestBody可以一起使用吗?如果是这样,请解释如何!非常感谢您的任何意见.
我的工作是让Spring创建新的Command对象并自动填充表单数据.然后从会话中手动单独调用/检索旧命令对象,最后手动将表单提交中不存在的所有属性复制到新命令对象中.现在,我将所有必要的数据放在一个命令对象中,以应用我的SQL更新.必须有一个更简单的方式......;)
更新:
今天发现这篇SOF帖子,同时进一步研究这个问题:
似乎没有开箱即用的SPRING解决方案,但需要了解处理它的最佳方法.在我的情况下,是的,我使用的是嵌套域对象,因此帖子中提供的解决方法并不好.有没有人有任何其他想法?为了清楚起见,我希望将JSON格式数据发布到Controller(而不仅仅是http表单发布数据).
好的,我已经为这个开了一个Spring Source JIRA请求,也许这是一个非常需要的改进:
https://jira.springsource.org/browse/SPR-10552
或者,这是一个以巧妙的方式利用杰克逊转换功能的情况,听起来像很多管道.
小智 0
为什么要使用 @RequestBody 注释 ModelAttribute,在 JSON 的情况下,只需使用 @SessionAttribute 并使用 @ModelAttribute 引用 Command 对象就足够了。
您使用@RequestBody的动机是什么