阻止Spring根据Accept标头创建“Whitelabel错误页面”

时间:2018-01-30 11:21:15

标签: java spring-boot

我有一个带有REST api的Spring Boot应用程序,可以生成JSON响应。为了处理错误,控制器使用response.sendError

定义ExceptionHandler
@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错误页面?

1 个答案:

答案 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;
}