java - 在 ExceptionHandler 中确定可接受的内容类型

标签 java spring spring-mvc spring-boot

在 Spring 应用程序中,我有一个通常返回图像的端点 (produces = MediaType.IMAGE_PNG_VALUE)。

我还有 @ExceptionHandler 函数来处理各种功能。

我正在尝试从 @ExceptionHandler 中找到一种方法来确定客户端是否会接受 text/plaintext/json 所以如果出现错误,我可以返回其中一个,或者如果他们只需要 image/png 则忽略它。

我如何确定可以为给定请求返回哪些可接受的内容类型?

最佳答案

您可以访问请求以检查 header 并返回适当的响应。是标准Content Negotiation .

举个例子:

@ControllerAdvice
public class MyExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(value = {RuntimeException.class})
    protected ResponseEntity<Object> handleMyException(RuntimeException ex, WebRequest request) {
        List<String> acceptableMimeTypes = Arrays.asList(request.getHeaderValues(HttpHeaders.ACCEPT));
        if (acceptableMimeTypes.contains(MediaType.TEXT_PLAIN_VALUE)) {
            return ResponseEntity.ok()
                    .header(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE)
                    .body("hello");
        }
        throw ex;
    }
}

有一些参数 spring-mvc 可以自动注入(inject)到 controller 方法中,而 WebRequest (即 springhttp 请求的表示)就是其中之一。如果客户端随请求发送了一个 Accept : text/plain header ,如果出现 RuntimeException,则上面的示例返回字符串 hello。如果没有异常,这个逻辑根本不会被触发,所以端点将只返回它通常返回的任何内容。您可以阅读有关 @ControllerAdvice@ExceptionHandler 的更多信息 here .

当然,一定要考虑您要处理的确切异常类型,并返回语义上适当的状态代码,以便客户端知道如何正确解释响应。

关于java - 在 ExceptionHandler 中确定可接受的内容类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47441304/

相关文章:

java - 使用 spring-boot 的 Maven 模块

java - Spring MVC 将请求从 Cp1252 编码为 UTF-8

java - 使用java在jboss中使用MDB的JMS队列监听器和发布器

java - 从 SimpleJdbcTemplate 查询返回的大列表

java - 游戏编程中的类设计

java - 出现异常,我不知道为什么

java - 在 Spring 5 Webflux 中启用 CORS?

java - spring boot 中所有资源都需要设置默认角色吗?

java - Spring MVC中的多个@RequestMapping(值、方法对)

spring-mvc - 如何在sitemesh装饰器中获取模型属性或spring的bean?