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