在上述例子中,通过@ControllerAdvice
统一定义不同Exception映射到不同错误处理页面。而当我们要实现RESTful API时,返回的错误是JSON格式的数据,而不是HTML页面,这时候我们也能轻松支持。
本质上,只需在@ExceptionHandler
之后加入@ResponseBody
,就能让处理函数return的内容转换为JSON格式。
下面以一个具体示例来实现返回JSON格式的异常处理。
- 创建统一的JSON返回对象,code:消息类型,message:消息内容,url:请求的url,data:请求返回的数据
12345678910111213
public
class
ErrorInfo<T> {
public
static
final
Integer OK =
0
;
public
static
final
Integer ERROR =
100
;
private
Integer code;
private
String message;
private
String url;
private
T data;
// 省略getter和setter
}
- 创建一个自定义异常,用来实验捕获该异常,并返回json
1234567
public
class
MyException
extends
Exception {
public
MyException(String message) {
super
(message);
}
}
Controller
中增加json映射,抛出MyException
异常123456789@Controller
public
class
HelloController {
@RequestMapping
(
"/json"
)
public
String json()
throws
MyException {
throw
new
MyException(
"发生错误2"
);
}
}
- 为
MyException
异常创建对应的处理123456789101112131415@ControllerAdvice
public
class
GlobalExceptionHandler {
@ExceptionHandler
(value = MyException.
class
)
@ResponseBody
public
ErrorInfo<String> jsonErrorHandler(HttpServletRequest req, MyException e)
throws
Exception {
ErrorInfo<String> r =
new
ErrorInfo<>();
r.setMessage(e.getMessage());
r.setCode(ErrorInfo.ERROR);
r.setData(
"Some Data"
);
r.setUrl(req.getRequestURL().toString());
return
r;
}
}
- 启动应用,访问:http://localhost:8080/json,可以得到如下返回内容:
-
123456
{
code:
100
,
data:
"Some Data"
,
message:
"发生错误2"
,
url:
"http://localhost:8080/json"
}
至此,已完成在Spring Boot中创建统一的异常处理,实际实现还是依靠Spring MVC的注解,更多更深入的使用可参考Spring MVC的文档。