如果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" }
可以使用HttpServletResponse.sendError(int)方法更改http响应状态代码,例如
@ExceptionHandler void handleIllegalArgumentException(IllegalArgumentException e, HttpServletResponse response) throws IOException { response.sendError(HttpStatus.BAD_REQUEST.value()); }
另外,@ExceptionHandler如果您有两个或多个异常来生成相同的响应状态,则可以在批注中声明异常类型:
@ExceptionHandler
@ExceptionHandler({IllegalArgumentException.class, NullPointerException.class}) void handleBadRequests(HttpServletResponse response) throws IOException { response.sendError(HttpStatus.BAD_REQUEST.value()); }
可以在我的博客文章中找到更多信息。