在日常 web 开发中发生了异常,往往需要通过一个统一的 异常处理,来保证客户端能够收到友好的提示。本文将会介绍 Spring Boot 中的 全局统一异常处理。
Springboot的全局异常查是通过两个注解@ControllerAdvice和@ExceptionHandler来实现的。
只有代码出错或者throw出来的异常才会被捕捉处理,如果被catch的异常,就不会被捕捉,除非catch之后再throw异常。
@ControllerAdvice:增强型控制器,对于控制器的全局配置放在同一个位置,全局异常的注解,放在类上。
@ControllerAdvice默认只会处理controller层抛出的异常,如果需要处理service层的异常,需要定义一个自定义的MyException来继承RuntimeException类,然后@ExceptionHandler(MyException)即可。
@ExceptionHandler:指明需要处理的异常类型以及子类。注解放在方法上面。
项目设置
GlobalExceptionHandler.java
package com.dx.controller; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; @ControllerAdvice(basePackages = "com.dx.controller") public class GlobalExceptionHandler { @ExceptionHandler(value = Exception.class) @ResponseBody public Map<String, Object> errorResult() { Map<String, Object> errorResult = new HashMap<String, Object>(); errorResult.put("errorCode", "500"); errorResult.put("errorMsg", "AOP捕获全局异常。"); return errorResult; } // ⒈全局异常处理返回字符串 @ExceptionHandler(MyPageException.class) @ResponseBody public String exception(MyPageException e) {// 未知的异常做出响应 return "MyPageException"; } // ⒉全局异常处理返回JSON @ExceptionHandler(value = MyJsonException.class) @ResponseBody public ErrorInfo<String> jsonErrorHandler(HttpServletRequest req, MyJsonException e) throws Exception { ErrorInfo<String> r = new ErrorInfo<String>(); r.setMessage(e.getMessage()); r.setCode(ErrorInfo.ERROR); r.setData("Some Data"); r.setUrl(req.getRequestURL().toString()); return r; } // ⒊全局异常处理返回JSP @ExceptionHandler(MyJspException.class) public String exception(Exception e) { return "MyJspException"; } }
ErrorInfo.java
package com.dx.controller; 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; public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public T getData() { return data; } public void setData(T data) { this.data = data; } }