在日常 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; } }
MyJsonException.java
package com.dx.controller; public class MyJsonException extends Exception { public MyJsonException(String message) { super(message); } }
MyJspException.java
package com.dx.controller; public class MyJspException extends Exception { public MyJspException(String message) { super(message); } }
MyPageException.java
package com.dx.controller; public class MyPageException extends Exception { public MyPageException(String message) { super(message); } }
App.java
package com.dx; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } }
測試類:
TestController.java
package com.dx.controller.member; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.dx.controller.MyJsonException; import com.dx.controller.MyJspException; import com.dx.controller.MyPageException; @Controller public class TestController { @RequestMapping("/json") public String json() throws MyJsonException { if (1 == 1) throw new MyJsonException(""); return "index"; } @RequestMapping("/jsp") public String jsp() throws MyJspException { if (1 == 1) throw new MyJspException(""); return "index"; } @RequestMapping("/page") public String page() throws MyPageException { if (1 == 1) throw new MyPageException(""); return "index"; } @RequestMapping("/common1") public String common1() throws RuntimeException { if (1 == 1) throw new RuntimeException(""); return "index"; } @RequestMapping("/common2") public String common2() throws Exception { int i = 2 / 0; return "index"; } }
測試1 json:
http://localhost:8080/json
測試2 page:
http://localhost:8080/page
測試3 jsp:
http://localhost:8080/jsp
注:需要配置一下才能支持jsp
①需要在pom添加JSP的支持
<!-- 對JSP的解析支持 --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency> <!-- 對JSTL的支持 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency>
②需要配置application.properties
在src/main/resources下添加application.properties配置文件,並配置如下內容:
# \u9875\u9762\u9ED8\u8BA4\u524D\u7F00\u76EE\u5F55 spring.mvc.view.prefix=/WEB-INF/ # \u54CD\u5E94\u9875\u9762\u9ED8\u8BA4\u540E\u7F00 spring.mvc.view.suffix=.jsp
③需要添加jsp文件
測試4 common1,common2:
http://localhost:8080/common1
http://localhost:8080/common2