在Spring应用程序中,我有一个通常返回图像的端点(produces = MediaType.IMAGE_PNG_VALUE
)。
我还有@ExceptionHandler
个函数来处理各种函数。
我正试图找到一种方法,在@ExceptionHandler
内确定客户是否接受text/plain
或text/json
,以便在出现错误时我可以返回其中之一,如果只是期待image/png
,则省略它。
如何确定我可以为给定请求返回哪些可接受的内容类型?
答案 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
方法,WebRequest
(spring
代表http
} request)就是其中之一。如果客户端已向请求发送了Accept : text/plain
标头,则上面的示例将返回字符串hello
,如果有RuntimeException
的话。如果没有异常,则该逻辑根本不会被触发,因此端点将返回它通常返回的任何内容。您可以详细了解@ControllerAdvice
和@ExceptionHandler
here。
当然,请务必考虑要处理的确切异常类型,以及要返回的语义上适当的状态代码,以便客户端知道如何正确解释响应。