我已经使用JHipster作为启动模板构建了一个应用程序。
JHipster提供了一个用@ControllerAdvice
注释的ExceptionTranslator
类,它对控制器中客户端请求生成的错误进行异常处理。这个类将异常类型映射到方法,每个方法构建并返回一个类型为ErrorDTO
的对象,然后用JSON序列化该对象并将其发送到客户端。我为一个简单的用例添加了自己的方法:
@ExceptionHandler(IllegalArgumentException.class)
@ResponseBody
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ErrorDTO processIllegalArgumentException(IllegalArgumentException exception) {
return new ErrorDTO(ErrorConstants.ERR_VALIDATION, exception.getMessage());
}
它工作得很好,如果发生错误(在这种情况下是一个太短的值),我会在客户端上收到这个JSON:
{
"message":"error.validation",
"description":"The request payload that defines the search terms should be at least 3 characters long.",
"fieldErrors":null
}
然而,当Spring MVC本身在进入控制器之前生成错误时(例如,缺少所需的参数),客户端接收到的json的结构是不同的,例如:
{
"timestamp":"2015-11-27T15:08:32.897+0000",
"status":400,
"error":"Bad Request",
"exception": "org.springframework.http.converter.HttpMessageNotReadableException",
"message":"Required request body is missing: public java.lang.String ch.unine.directory.web.rest.SearchResource.search(java.lang.String)",
"path":"/api/search"
}
Spring Boot/Spring MVC用来表示错误的类(或其他机制)是什么?如果出现错误,我如何统一发送回客户端的数据类型,以便为错误页面提供一个漂亮的唯一模板?
我在这篇博客文章中找到了解决方案:http://www.jayway.com/2014/10/19/spring-boot-error-responses/:
在@ExceptionHandler
方法中,只需指定状态代码,让Spring处理其余部分。它将生成JSON响应,其字段与进入控制器之前发生错误时的字段相同:
@ExceptionHandler
void handleIllegalArgumentException(IllegalArgumentException e, HttpServletResponse response) throws IOException {
response.sendError(HttpStatus.BAD_REQUEST.value());
}
样本响应体:
{
"timestamp": "2015-11-27T16:08:46.148+0000",
"status": 400,
"error": "Bad Request",
"exception": "java.lang.IllegalArgumentException",
"message": "The request payload that defines the search terms should be at least 3 characters long.",
"path": "/api/search"
}