在 Spring 应用程序中,我有一个通常返回图像的端点 (produces = MediaType.IMAGE_PNG_VALUE
)。
我还有 @ExceptionHandler
函数来处理各种功能。
我正在尝试从 @ExceptionHandler
中找到一种方法来确定客户端是否会接受 text/plain
或 text/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
(即 spring
对 http
请求的表示)就是其中之一。如果客户端随请求发送了一个 Accept : text/plain
header ,如果出现 RuntimeException
,则上面的示例返回字符串 hello
。如果没有异常,这个逻辑根本不会被触发,所以端点将只返回它通常返回的任何内容。您可以阅读有关 @ControllerAdvice
和 @ExceptionHandler
的更多信息 here .
当然,一定要考虑您要处理的确切异常类型,并返回语义上适当的状态代码,以便客户端知道如何正确解释响应。
关于java - 在 ExceptionHandler 中确定可接受的内容类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47441304/