3

当客户端请求生成应用程序/json 内容的资源时,接受头为 application/xml。请求因 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);
      }
    }
4

2 回答 2

0

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

其他选项是:

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

第一个是最容易理解的,最新的可能是最“可扩展”的,但它也需要对 Spring 的内部结构有所了解。

于 2015-08-07T20:09:22.587 回答
0

通过为和设置不同的内容协商策略FixedContentNegotiationStrategy来解决。ExceptionHandlerExceptionResolverHeaderContentNegotiationStrategyRequestResponseBodyMethodProcessor

于 2017-07-01T17:46:42.697 回答