Spring MVC - 使用x-www-form-urlencoded导致MissingServletRequestParameterException的@RequestParam

时间:2015-11-16 08:30:10

标签: spring-mvc spring-boot spring-restcontroller

以下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错误。

1 个答案:

答案 0 :(得分:6)

如果你想Content-type:application/x-www-form-urlencoded意味着发送到服务器的HTTP请求的主体应该是一个巨大的字符串 - 名称/值对由&符号(&)分隔,并且将是{{ 1}}正如他的名字暗示的那样。

urlencoded

这意味着你不应该使用name=name1&value=value2,因为参数是在http请求的主体中传递的。

因此,如果您想从他们的文档中使用此@RequestParam

  

使用。将请求主体转换为方法参数   HttpMessageConverter。 HttpMessageConverter负责   从HTTP请求消息转换为对象并进行转换   从一个对象到HTTP响应体。该   RequestMappingHandlerAdapter支持@RequestBody注释   以下默认HttpMessageConverters:

     

ByteArrayHttpMessageConverter转换字节数组。

     

StringHttpMessageConverter转换字符串。

     

FormHttpMessageConverter将表单数据转换为MultiValueMap或从MultiValueMap转换。

     

SourceHttpMessageConverter转换为/来自   javax.xml.transform.Source。

您应该将content-type@RequestBody一起使用,这将获得此巨型字符串并将其转换为FormHttpMessageConverter。这是一个样本。

MultiValueMap<String,String>