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

时间:2017-11-22 18:08:06

标签: java spring spring-mvc spring-boot

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

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

我正试图找到一种方法,在@ExceptionHandler内确定客户是否接受text/plaintext/json,以便在出现错误时我可以返回其中之一,如果只是期待image/png,则省略它。

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

1 个答案:

答案 0 :(得分:3)

您可以访问请求以检查标头并返回适当的响应。它是标准的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可以自动注入controller方法,WebRequestspring代表http } request)就是其中之一。如果客户端已向请求发送了Accept : text/plain标头,则上面的示例将返回字符串hello,如果有RuntimeException的话。如果没有异常,则该逻辑根本不会被触发,因此端点将返回它通常返回的任何内容。您可以详细了解@ControllerAdvice@ExceptionHandler here

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