有一个 Java spring MVC web 应用程序,并且正在发出 jquery ajax 发布请求。我的控制器设置为接收和发送 json 数据。一切正常,JSON 字符串格式正确,Controller 可以创建和填充一个 Command 对象,并使用 JSON 请求数据的内容填充它。但是,我正在更新联系人对象的数据,而我的 JSP 表单元素仅包含数据库更新所需的所有数据的子集。在我对带有表单的 JSP 页面的初始 GET 请求中,我从数据库中检索所有必要的数据,填充一个 Contact Command 对象,然后将该命令对象绑定到模型。
如果我正在执行普通的 POST 提交表单提交,我相信只需将我的命令对象声明为 @SessionAttribute,并在我的 onSubmit() POST 方法中使用 @ModelAttribute 引用该命令对象就足够了。Spring 将从我的会话中检索已经填充的命令对象,然后绑定(覆盖)那些由于 POST 请求而更改的值。然后可以将该更新的命令对象用作数据库更新的参数。
但是,我正在使用 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
}
谁能告诉我将@RequestBody 与JSON 请求数据结合使用并将其绑定到现有的/@ModelAttribute 填充的Command 对象的“标准”或“最简单”的方法是什么,以便Command 对象完全由旧数据和新数据构成(以同样的方式,使用完整的 POST http 提交很容易实现)。
一个相关的问题是上面的代码有什么问题?@SessionAttribute 和带有 JSON 内容的 @RequestBody 可以一起使用吗?如果有,请说明方法!非常感谢您的任何意见。
我的解决方法是让 Spring 创建新的 Command 对象并自动填充表单数据。然后从会话中手动单独调用/检索旧命令对象,最后手动将表单提交中不存在的所有属性复制到新命令对象中。现在,我将所有必要的数据放在一个命令对象中,以应用我的 SQL 更新。必须有一个更简单的方法.... ;)
更新:
今天在进一步研究这个问题时发现了这个 SOF 帖子:
似乎没有开箱即用的已知 SPRING 解决方案,但有很多需求知道处理它的最佳方法。就我而言,是的,我使用的是嵌套域对象,因此帖子中提供的解决方法并不好。有没有人有任何其他想法?需要明确的是,我希望将 JSON 格式的数据发布到控制器(不仅仅是 http 表单发布数据)。
好的,我已经为此打开了 Spring Source JIRA 请求,也许这是一个非常需要的改进:
https://jira.springsource.org/browse/SPR-10552
否则,这是一个以聪明的方式利用杰克逊转换功能的案例,这听起来像是很多管道。