在上述例子中, 通过 @ControllerAdvice 统一定义不同 Exception 映射到不同错误处理页面. 而当我们要实现 RESTful API 时, 返回的错误是 JSON 格式的数据, 而不是 html 页面, 这时候我们也能轻松支持.
本质上, 只需在 @ExceptionHandler 之后加入 @ResponseBody, 就能让处理函数 return 的内容转换为 JSON 格式.
下面以一个具体示例来实现返回 JSON 格式的异常处理.
创建统一的 JSON 返回对象, code: 消息类型, message: 消息内容, url: 请求的 url,data: 请求返回的数据
- [java] view plain copy
- 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
- [java] view plain copy
- public class MyException extends Exception {
- public MyException(String message) {
- super(message);
- }
- }
Controller 中增加 json 映射, 抛出 MyException 异常
- [java] view plain copy
- @Controller
- public class HelloController {
- @RequestMapping("/json")
- public String json() throws MyException {
- throw new MyException("发生错误 2");
- }
- }
为 MyException 异常创建对应的处理
- [java] view plain copy
- @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, 可以得到如下返回内容 http://localhost:8080/json,可以得到如下返回内容 :
- [java] view plain copy
- {
- code: 100,
- data: "Some Data",
- message: "发生错误 2",
- url: "http://localhost:8080/json"
- }
至此, 已完成在 Spring Boot 中创建统一的异常处理, 实际实现还是依靠 Spring MVC 的注解, 更多更深入的使用可参考 Spring MVC 的文档.
来源: http://www.bubuko.com/infodetail-2633008.html