@RequestBody可选(例如required = false)

时间:2012-03-15 14:15:54

标签: spring-mvc annotations

有没有办法让RequestParam支持@RequestBody注释选项(例如required = false)?

我通过代码的主要途径是使用POST。但是,我还希望通过浏览器基本的http请求支持基本的GET请求以进行调试。但是,当我尝试这样做时,我得到了415不支持的媒体错误。

4 个答案:

答案 0 :(得分:7)

  

我通过代码的主要途径是使用POST。但是,我还想通过浏览器支持基本的GET请求

为此,请使用method注释的@RequestMapping属性,例如

@RequestMapping(value="/myPath", method=RequestMethod.GET)
public String doSomething() {
   ...
}

@RequestMapping(value="/myPath", method=RequestMethod.POST)
public String doSomething(@RequestBody payload) {
   ...
}

答案 1 :(得分:6)

@RequestBody现在显然可以在Spring 3.2M1中设置为可选:https://jira.springsource.org/browse/SPR-9239

但是我已经在Spring 3.2M2中对此进行了测试,并且即使在设置required = false之后通过null主体发送异常,而不是通过null。这个问题已得到确认并已得到修复,附表为3.2 RC1

答案 2 :(得分:3)

有没有办法让RequestParam支持@RequestBody注释选项(例如required = false)?

总之,我不相信,  但您可以从输入流手动执行此操作:

@Autowired
private MappingJacksonHttpMessageConverter mappingJacksonHttpMessageConverter;

RestResponse<String> updateViewingCard(@PathVariable(value = "custome") String customer,
        @RequestParam(value = "p1", required = false) String p1,
        @RequestParam(value = "p2", required = false) String p2, 
        // @RequestBody MyPayloadType payload,     Can't make this optional
        HttpServletRequest request,
        HttpServletResponse response)  throws... {

    MyPayloadType payload = null;
    if (0 < request.getContentLength()) {
            payload = this.mappingJacksonHttpMessageConverter.getObjectMapper().readValue(request.getInputStream(),
                    MyPayloadType.class);
    }

答案 3 :(得分:0)

是的,可以。在Spring 4或Spring Boot 1.5中,您可以通过以下方式进行操作:

@PostMapping("/error-report")
public String errorReport(@RequestBody(required = false) ErrorReportModel errorReportModel) {

    // YOUR LOGIC

    return "page-to-return";
}