2011-05-05 38 views
17

也许这应该是行不通的,但至少我想明白为什么。我在PUT body中传递了一个简单的val = somevalue,但是spring发回400 Bad Request,因为它似乎没有识别val参数。如果使用PUT,SpringMVC无法识别请求身体参数

相似的请求使用POST。难道是SpringMVC不认识PUT请求身体作为参数的来源吗?

Content=-Type在两种情况下都正确设置为application/x-www-form-urlencoded。

春天拒绝调用的方法是这样的:

@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) {...} 
     });  

任何想法?

+0

当它更改为POST时,它会工作吗? – 2011-05-05 12:30:33

+0

为什么用@ResponseBody在void方法中注释该方法?该注释应该表明返回类型应直接写入HTTP响应主体。我认为情况并非如此。你可以尝试这样做,以及:数据:{“VAL”,encodeURIComponent方法(configValue)}, – Javi 2011-05-05 14:53:10

+0

那是什么回来与400代码错误消息? – skaffman 2011-05-05 17:06:06

回答

19

我不知道在这一点周围的工作,但这里是bug报告这是一个“不会固定。”我一直在争取同样的问题

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

另见:http://markmail.org/thread/bqb44tqnhmvtlji6 – 2011-10-24 16:15:41

+0

感谢您的链接的讨论Tomcat的名单上,它澄清了问题。在我的情况与@RequestBody注释的解决方案没有用自定义模型/格式支持bean类的工作,而不是多重映射。所以我使用的HiddenHttpMethodFilter,我从jQuery的发送POST请求包括_method =把PARAM代替,如PHP编码器建议。 – meyertee 2011-12-14 14:03:03

1

我没有合适的解决方案适合你,但你的情况我尝试以下操作:

  • form:form method="PUT"
  • 创建页面申报HiddenHttpMethodFilterweb.xml

要是这样的作品,那么

  • 变化typePUTPOST在Ajax调用
  • 添加所需的PARAMS该客户端具有form:form标签(像_method

换句话说,我的理解春季基于简单POST特定参数模拟PUT。只要发给他他想要的东西。

参见:http://stsmedia.net/spring-finance-part-2-spring-mvc-spring-30-rest-integration/和相关的代码示例有:http://code.google.com/p/spring-finance-manager/source/browse

HTH

1

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

说了这么多,更好的和更容易的解决办法是没有数据元素从javascript/jQuery呼叫传递并通过您的参数作为URL本身的一部分。意思是,你可以在GET调用中设置url字段中的参数。

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

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

12

Since春季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> 
+1

你是我的英雄! – 2014-03-26 18:36:45

+0

这将进入您的web.xml – tibi 2016-12-13 11:33:12