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

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

当客户端请求资源产生 application/json 内容时,带有 application/xml 的 Accept Header。请求因 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);
      }
    }

最佳答案

我想到了几个选项。一种是您的 Controller 方法生成所有 内容类型,然后如果内容类型不是您期望的类型,则在您的方法中抛出异常,然后异常处理程序可以接受此异常并对其进行转换。这是唯一与异常处理程序一起使用的方法,因为异常处理程序处理 Controller 方法中产生的异常。

其他选项是:

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

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

关于spring - 如何通过使用异常处理程序注释将错误内容写入响应主体来处理 HttpMediaTypeNotAcceptableException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31885546/

相关文章:

Spring配置和运行时分离

spring - Java Spring 配置和 Resteasy

java - 与 Hibernate 一对一关系,提交 JSP 表单时出现共享 key 错误

junit - 使用 WebTestClient 和 ControllerAdvice 单元测试 Spring Controller

java - 为什么RestController要公开CrudRepository中的所有操作?

spring-boot - Spring Boot RestController 不返回 JSON 数据

spring - FluentD 无法在 Elasticsearch 中写入日志

java - 从 JAXB 响应对象获取 Map 值

caching - 向 Spring Controller 添加 header

redirect - Spring MVC : Displaying of validation messages after redirect