小编典典

Spring Boot自定义http错误响应?

spring-boot

如果Spring Boot Web应用程序中发生异常,如何自定义响应状态代码和响应正文中的数据?

我创建了一个Web应用程序,如果由于某些不良的内部状态而发生意外情况,该应用程序将引发自定义异常。因此,触发错误的请求的响应主体类似于:

HTTP/1.1 500 Internal Server Error
{
    "timestamp": 1412685688268,
    "status": 500,
    "error": "Internal Server Error",
    "exception": "com.example.CustomException",
    "message": null,
    "path": "/example"
}

现在,我想更改状态代码并在响应正文中设置字段。一个让我着迷的解决方案是:

@ControllerAdvice
class CustomResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ResponseBody
    ErrorMessage handleBadCredentials(CustomException e) {
        return new ErrorMessage("Bad things happened");
    }
}

@XmlRootElement
public class ErrorMessage(
    private String error;

    public ErrorMessage() {
    }

    public ErrorMessage(String error) {
        this.error = error;
    }

    public String getError() {
        return error;
    }

    public void setError(String error) {
        this.error = error;
    }
)

但是,这(完全怀疑)产生了完全不同的响应:

HTTP/1.1 400 Bad Request
{
    "error": "Bad things happened"
}

阅读 325

收藏
2020-05-30

共1个答案

小编典典

可以使用HttpServletResponse.sendError(int)方法更改http响应状态代码,例如

@ExceptionHandler
void handleIllegalArgumentException(IllegalArgumentException e, HttpServletResponse response) throws IOException {
    response.sendError(HttpStatus.BAD_REQUEST.value());
}

另外,@ExceptionHandler如果您有两个或多个异常来生成相同的响应状态,则可以在批注中声明异常类型:

@ExceptionHandler({IllegalArgumentException.class, NullPointerException.class})
void handleBadRequests(HttpServletResponse response) throws IOException {
    response.sendError(HttpStatus.BAD_REQUEST.value());
}

可以在我的博客文章中找到更多信息。

2020-05-30