后续的Spring MVC代码引发MissingServletRequestParameterException,
@Controller @RequestMapping("/users") public class XXXXResource extends AbstractResource { ..... @RequestMapping(method = RequestMethod.PUT , produces = {"application/json", "application/xml"} , consumes = {"application/x-www-form-urlencoded"} ) public @ResponseBody Representation createXXXX(@NotNull @RequestParam("paramA") String paramA, @NotNull @RequestParam("paramB") String paramB, @NotNull @RequestParam("paramC") String paramC, @NotNull @RequestParam("paramD") String paramD ) throws Exception { ... } }
日志中没有堆栈跟踪,只有Postman的请求返回HTTP 400错误。
如果您想Content-type:application/x-www-form- urlencoded表示发送到服务器的HTTP请求的主体应该是一个巨大的字符串- 名称/值对由&符分隔,(&)并且urlencoded就像他的名字所暗示的那样。
Content-type:application/x-www-form- urlencoded
(&)
urlencoded
name=name1&value=value2
这意味着您不应使用,@RequestParam因为参数是在http请求的正文中传递的。
@RequestParam
因此,如果您想content-type从他们的文档中使用它:
content-type
您可以使用HttpMessageConverter将请求主体转换为方法参数。HttpMessageConverter负责从HTTP请求消息转换为对象,并从对象转换为HTTP响应主体。RequestMappingHandlerAdapter通过以下默认HttpMessageConverters支持@RequestBody批注: ByteArrayHttpMessageConverter转换字节数组。 StringHttpMessageConverter转换字符串。 FormHttpMessageConverter将表单数据与MultiValueMap之间进行转换。 SourceHttpMessageConverter可与javax.xml.transform.Source之间进行转换。
您可以使用HttpMessageConverter将请求主体转换为方法参数。HttpMessageConverter负责从HTTP请求消息转换为对象,并从对象转换为HTTP响应主体。RequestMappingHandlerAdapter通过以下默认HttpMessageConverters支持@RequestBody批注:
ByteArrayHttpMessageConverter转换字节数组。
StringHttpMessageConverter转换字符串。
FormHttpMessageConverter将表单数据与MultiValueMap之间进行转换。
SourceHttpMessageConverter可与javax.xml.transform.Source之间进行转换。
您应该使用@RequestBodywith FormHttpMessageConverter,它将获得这个巨大的字符串并将其转换为 MultiValueMap<String,String>。这是一个样本。
@RequestBody
FormHttpMessageConverter
MultiValueMap<String,String>
@RequestMapping(method = RequestMethod.PUT , consumes = {"application/x-www-form-urlencoded"} ,value = "/choice" ) public @ResponseBody String createXXXX(@RequestBody MultiValueMap params) throws Exception { System.out.println("params are " + params); return "hello"; }