Spring允许定义@ExceptionHandlers
代替@RestControllerAdvice
.
我已经定义了很多其他的ExceptionHandlers
其中适用于 HTTP 400、404、405...但是,HTTP 406 (NOT_ACCEPTABLE) 的 ExceptionHandler 似乎不起作用。处理程序被触发,我在日志中检查了这一点,但结果未使用。
我的目标是返回带有 JSON 正文的 HTTP 406。
变体1
@ResponseStatus(HttpStatus.NOT_ACCEPTABLE)
@ExceptionHandler(HttpMediaTypeNotAcceptableException.class)
public ErrorDTO requestMethodNotSupported(final HttpMediaTypeNotAcceptableException e) {
final ErrorDTO dto = new ErrorDTO(HttpStatus.NOT_ACCEPTABLE, "http.media_not_acceptable");
return dto;
}
变体2
@ExceptionHandler(HttpMediaTypeNotAcceptableException.class)
public ResponseEntity<ErrorDTO> requestMethodNotSupported2(final HttpMediaTypeNotAcceptableException e) {
final ErrorDTO dto = new ErrorDTO(HttpStatus.NOT_ACCEPTABLE, "http.media_not_acceptable");
return ResponseEntity.status(HttpStatus.NOT_ACCEPTABLE).contentType(MediaType.APPLICATION_JSON_UTF8).body(dto);
}
但我总是从 Tomcat 得到与此类似的 HTML 响应:
HTTP 状态 406 -
类型:状态报告
message:
描述: 标识的资源
该请求只能生成响应
根据“接受”请求,特性不可接受
标头。
代替
{
“错误代码”:406,
“errorMessage”:“http.media_not_acceptable”
}
请求标头:
实际响应标头:
预期响应标头:
我知道我可以简单地“修复”客户端发送的 Accept-Header,但是如果服务器不知道如何响应,则应始终以 JSON 进行响应。
我使用 Spring 4.3.3.RELEASE 和 Jackson 2.8.4。