如果使用PUT,SpringMVC无法识别请求体参数

时间:2011-05-05 07:42:10

标签: jquery rest spring-mvc

也许这应该不起作用,但至少我想了解为什么。我在PUT正文中传递了一个简单的val = somevalue但是spring发回400 Bad Request,因为它似乎无法识别val参数。

类似的请求适用于POST。可能 SpringMVC 无法将PUT请求正文识别为参数来源吗?

在这两种情况下,

Content=-Type都正确设置为application / x-www-form-urlencoded。

Spring拒绝调用的方法是:

@RequestMapping(value = "config/{key}", method = RequestMethod.PUT)
@ResponseBody
public void configUpdateCreate(final Model model, @PathVariable final String key, @RequestParam final String val,
        final HttpServletResponse response) throws IOException
{
    //...
}

为了完整性,这里是jquery ajax调用。我看不出有什么不妥。客户端是Firefox 4或Chrome,两者都显示相同的结果。

$.ajax({
         url:url,
         type:'PUT',
         data:'val=' + encodeURIComponent(configValue),
         success: function(data) {...}
       });      

有什么想法吗?

4 个答案:

答案 0 :(得分:19)

我现在还不知道有什么工作,但这里的错误报告是“不会修复”。我一直在打同样的问题

https://jira.springsource.org/browse/SPR-7414

更新:这是我的修复。我正在使用RequestBody注释。然后使用MultiValueMap。

http://static.springsource.org/spring/docs/3.0.5.RELEASE/reference/mvc.html#mvc-ann-requestbody

@RequestMapping(value = "/{tc}", method = RequestMethod.PUT) 
public void update(@PathVariable("tc") final String tc, 
@RequestBody MultiValueMap<String,String> body, HttpServletResponse response) {

    String name = body.getFirst("name");
// more code
}

答案 1 :(得分:12)

Since Spring 3.1,使用org.springframework.web.filter.HttpPutFormContentFilter解决了这个问题。

<filter>
    <filter-name>httpPutFormContentFilter</filter-name>
    <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>httpPutFormContentFilter</filter-name>
    <servlet-name>rest</servlet-name>
</filter-mapping>

答案 2 :(得分:1)

我没有适合您的解决方案,但在您的情况下,我会尝试以下方法:

  • 使用form:form method="PUT"
  • 创建页面
  • HiddenHttpMethodFilter
  • 中声明web.xml

如果这样可行,那么

  • 在ajax调用中将typePUT更改为POST
  • 添加客户拥有form:form标记的所需参数(类似_method

换句话说,据我所知,Spring基于带有特殊参数的简单PUT模拟POST。只要发给他他想要的东西。

另请参阅:http://stsmedia.net/spring-finance-part-2-spring-mvc-spring-30-rest-integration/及相关代码示例:http://code.google.com/p/spring-finance-manager/source/browse

HTH

答案 3 :(得分:1)

如上所述,这似乎是spring/servlet API中的错误。实际上,PUT请求应该在Request Body (or payload)上工作,而不是在请求参数上。从这个意义上讲,servlet API&amp;春天的处理是正确的。

话虽如此,更好,更简单的解决方法是从javascript/jQuery调用中传递数据元素,并将您的参数作为网址本身的一部分传递。意思是,在网址字段中设置参数,就像在GET调用中一样。

$.ajax({
            url: "yoururl" + "?param1=param2Val&..",
            type: "PUT",
            data: "",
            success: function(response) {
                // ....
            }
     });

现在这适用于简单的参数,我猜,它不适用于复杂的JSON类型。希望这可以帮助。