2012-06-19 35 views
1

我有一个简单的Spring程序,后端是Spring MVC和Restful web服务,前端是纯HTML + ajax。如何排查spring mvc映射问题?

我的问题是,当我尝试使用下面的HTTP请求参数映射到一个POJO,它总是失败:

@RequestMapping(value = "/books", method = RequestMethod.PUT) 
    public @ResponseBody 
    String updateBook(BookInfo book) 

这里我使用PUT方法,因为它是一个修改操作。没有例外,但我没有注入书本对象。

用相同的HTTP请求参数,如果我改变了方法POST,和客户端通过POST发送,这将是成功的:

@RequestMapping(value = "/books", method = RequestMethod.POST) 
public ResponseEntity<String> addBook(BookInfo book) 

这次本书总是会得到填补。

为什么PUT和POST有区别?或者它是返回类型的问题? (一个是ResponseBody,另一个是ResponseEntity)?或者,如果您使用PUT,那么pojo必须处于持久性上下文中?

我该如何调查该问题?

回答

0

我认为它不是你的配置或代码的问题。 在Spring框架中,提供了一个名为HiddenHttpMethodFilter的过滤器,该过滤器服务于所有方法,但最初它将执行POST请求,但是具有隐藏的表单字段。这个过滤器读取这个隐藏的字段值,然后相应地更改方法值。请参阅this link以了解更多信息。我认为使用此过滤器进行配置可以解决您的问题。

希望这可以帮助你。干杯。

+0

嗨,感谢您的技巧。我会试一试并反馈。 –

+0

不客气。我很确定这会解决你的问题。但我建议你一次通过我提供的链接。 :-) –

+0

结果是一个真正的映射问题,在客户端,我应该使用dojo.xhrPut({url:'path/to/resource',putData:data,headers:{...“application/json “},并且在服务器端,我应该在映射的bean之前添加@requestBody,以确保spring从url以外的请求主体进行映射。完成这个更改后,PUT方法可以工作。但是,我仍在研究什么是dojo.xhrPut({putData:data})和dojo.xhrPut({content:data})之间的区别,听起来像是这个问题 –