如何通过使用异常处理程序注释将错误内容写入响应主体来处理HttpMediaTypeNotAcceptableException?

时间:2015-08-07 19:48:59

标签: spring spring-mvc spring-restcontroller spring-web

当客户端请求使用Accept Header of application / xml生成application / json内容的资源时。请求因HttpMediaTypeNotAcceptableException异常而失败,并通过使用异常处理程序注释将其包装到响应实体对象中的错误消息正文中,如下面的代码所述。但是,当使用HttpMessageConverter将返回值写入响应时,我们再次收到HttpMediaTypeNotAcceptableException。这是因为它使用可接受的请求类型检查可生成的内容类型以获得响应,但这正是我们尝试使用错误消息与客户端通信的内容。我该如何解决这个问题?顺便说一句,所有其他异常都解析错误消息。请指教。

@ControllerAdvice
    public class RestExceptionHandler extends ResponseEntityExceptionHandler {

     @Override
      protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body,
          HttpHeaders headers, HttpStatus status, WebRequest request) {
          // Setting the response content type to json
          headers.setContentType(MediaType.APPLICATION_JSON);
        return ResponseEntity.status(status).headers(headers).body(body);
      }
    }

2 个答案:

答案 0 :(得分:0)

我想到了一些选择。一个是你的控制器方法生成所有内容类型,然后如果内容类型不是你期望的内容类型,则在方法中抛出异常,然后异常处理程序可以获取此异常并对其进行转换。这是唯一适用于异常处理程序的方法,因为异常处理程序处理控制器方法中产生的异常。

其他选项包括:

  • 使用拦截器(但我不确定这是否可行,因为Spring可能会先尝试解析控制器方法而不是调用拦截器)。
  • 如果找不到合适的方法,则扩展RequestMappingHandlerMapping以调用异常处理程序。您可能需要覆盖方法handleNoMatch。在那里,您需要获得对HandlerExceptionResolver
  • 列表的引用

第一个是最容易理解的,最新的可能是最具可扩展性的,但它也需要对Spring的内部有一些了解。

答案 1 :(得分:0)

通过为FixedContentNegotiationStrategy设置不同的内容协商策略ExceptionHandlerExceptionResolver,为HeaderContentNegotiationStrategy设置RequestResponseBodyMethodProcessor