我有一个带有REST api的Spring Boot应用程序,可以生成JSON响应。为了处理错误,控制器使用response.sendError
:
@ExceptionHandler(MyApiException.class)
public void handleControllerException(MyApiException ex,
HttpServletResponse response) throws IOException {
response.sendError(ex.getStatus().value(), ex.getResponseMessage());
}
这通常会导致JSON错误响应,例如:
{"timestamp":"2018-01-30T11:22:33.456Z", "status":400, "error":"Bad Request",
"message":"No customer with ID 123 found", "path":"/my/api/endpoint"}
但是如果客户端发送一个Accept标头,指示它支持html,例如text/html
或类似的,则Spring会回到HTML错误页面(在此处表示为纯文本):
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Tue Jan 30 11:22:33 CET 2018
There was an unexpected error (type=Bad Request, status=400).
No customer with ID 123 found
如何让Spring禁用此行为并始终使用JSON进行响应?我找到了一些覆盖或禁用Spring错误页面的一般方法,但这似乎相当复杂,通常旨在提供自定义的错误页面。在使用浏览器进行手动调试时,这只是一个小麻烦(实际的客户端不会发送有问题的Accept标头),所以我无法证明对应用程序进行大的更改。是否有一种简单的方法可以阻止Spring根据Accept标题切换到HTML错误页面?
答案 0 :(得分:0)
将@ResponseBody
注释和响应对象添加到handleControllerException
方法`。
你的方法看起来像这样
@ResponseBody
@ExceptionHandler(MyApiException.class)
public ErrorModel handleControllerException(MyApiException ex,
HttpServletResponse response) throws IOException {
final int status = HttpStatus.INTERNAL_SERVER_ERROR.value();
// Or any other status
response.setStatus(status);
final ErrorModel errorModel = new ErrorModel();
errorModel.setMessage(ex.getMessage());
return errorModel;
}