使用RequestMapping注释使弹簧引导返回406而不是415

时间:2016-08-23 04:56:32

标签: java spring spring-mvc

****编辑****

根据反馈,我附上以下免责声明:

知道 415是正常代码,我 知道 导致它的正常情况。我正在实现的API由于某种原因指定了这个覆盖,我无法改变它,因为我无法控制它

****结束编辑****

所以我有以下内容:

@RequestMapping(method = POST, path = "/foo", 
                consumes = "application/json", produces = "application/json")
public ResponseEntity<Something> postFoo() {
    return null;
}

当我发布没有设置Content-Type标头的消息时,我得到了预期的415,但是我想更改它以返回406而没有任何样板代码。那可能吗?我进行了搜索和搜索,但似乎无法找到任何文档告诉我如何做到这一点。

2 个答案:

答案 0 :(得分:-2)

当指定的&​​#34;内容类型&#34;时,

415是适当的响应状态。目标服务不支持标头。 406表示&#34;不接受&#34;,只有在无效(或缺失)&#34;接受&#34;标题已提供。

您所看到的行为是正确的,您不应该做任何改变。

答案 1 :(得分:-3)

您会考虑return new ResponseEntity(HttpStatus.NOT_ACCEPTABLE)样板吗?

修改

感谢您的澄清:Spring在处理请求之前抛出异常,然后再输入处理程序方法。因此,您可以做的是更改该特定异常的默认行为。为此,请创建您自己的ResponseEntityExceptionHandler,覆盖该特定方法,如下所示:

@ControllerAdvice
public class GlobalWebExceptionHandler extends ResponseEntityExceptionHandler {
    @Override
    protected ResponseEntity handleHttpMediaTypeNotSupported(HttpMediaTypeNotSupportedException ex, HttpHeaders headers, HttpStatus status, WebRequest request){
        /* other processing */
        return new ResponseEntity(HttpStatus.NOT_ACCEPTABLE);
    }
}

Here是一篇很好的文章。