2011-07-16 82 views
1

我有一个简单的Spring 3.0控制器与PUT请求映射春3.0 MVC数据绑定PUT

@Controller 
public class FooController { 
    @RequestMapping(value = "/foo/{id}", method = RequestMethod.PUT) 
    public @ResponseBody FooView put(@PathVariable String id, @Valid PutFoo putFoo, BindingResult bindingResult) { 
     inspector.inspect(bindingResult); 
     return fooService.update(id, putFoo); 
    } 
} 

当我在请求体执行PUT与Foo参数,所述PutFoo对象不被填充/绑定该数据。如果我将HttpServletRequest添加到方法签名并打印请求的主体,那么确定数据在那里,但PutFoo是空的。

如果我将请求方法类型更改为POST然后执行POST,这一切都和谐地工作。

为了完整起见,我打通过卷曲的端点 curl -H 'Content-Type: application/x-www-form-urlencoded' -X PUT -F "fooString=foo" http://localhost:8080/foo/9999

+0

http://stackoverflow.com/questions/5894270/springmvc-is-导致卷曲POST使用 内容类型的multipart/form-data的数据not-recognizing-request-body-parameters-if-using-put 虽然我没有被HTTP 400拒绝,但这个问题看起来接近这个问题。我认为答案中链接的JIRA可能是我的答案太。 – markdsievers

回答

1

你确定你实际上是发送一个HTTP PUT请求,因为使用的是冲突的卷曲参数。例如

-F,--form

(HTTP)这允许卷曲模拟填充的形式,其中用户具有 按下提交按钮。为此,根据RFC 2388.

source

+0

那么,它肯定会进入用RequestMethod.PUT注解的方法,我将通过代理运行它,也许完整的HTTP请求可能会被使用。 – markdsievers

+0

是的,所以这是用户错误 - 通过代理比较两个请求;一个使用上面的cURL命令,另一个使用'-F“fooString = foo”'并将参数作为URL参数添加。第二次工作!查看代理输出,第二个Content-Type是按照规定的,但第一个也有'boundary = ....',正如你所说的那样,表示multipart/form-data,它的数据在body中。 – markdsievers