Spring boot異常統一處理方法:@ControllerAdvice注解的使用、全局異常捕獲、自定義異常捕獲


一、全局異常

1、首先創建異常處理包和類

2、使用@ControllerAdvice注解,全局捕獲異常類,只要作用在@RequestMapping上,所有的異常都會被捕獲

package com.example.demo.exception; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import java.util.HashMap; import java.util.Map; /** * 全局捕獲異常類,只要作用在@RequestMapping上,所有的異常都會被捕獲 */ @ResponseBody @ControllerAdvice public class MyControllerAdvice { @ExceptionHandler(value = Exception.class) public Map<String,Object> errorHandle(Exception e){ Map<String,Object> map = new HashMap<String,Object>(); map.put("code",-1); map.put("msg",e.getMessage()); return map; } }

  這上面有個需要注意的是要加上@ResponseBody注解,如果不加會怎么樣呢,我們試下,報錯:

javax.servlet.ServletException: Circular view path [hello]: would dispatch back to the current handler URL [/hello] again. 
Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.) at org.springframework.web.servlet.view.InternalResourceView.prepareForRendering(InternalResourceView.java:209) ~[spring-webmvc-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:147) ~[spring-webmvc-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:314) ~[spring-webmvc-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1325) ~[spring-webmvc-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1069) ~[spring-webmvc-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1008) ~[spring-webmvc-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925) ~[spring-webmvc-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974) ~[spring-webmvc-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:866) ~[spring-webmvc-5.0.6.RELEASE.jar:5.0.6.RELEASE] at javax.servlet.http.HttpServlet.service(HttpServlet.java:635) ~[tomcat-embed-core-8.5.31.jar:8.5.31] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851) ~[spring-webmvc-5.0.6.RELEASE.jar:5.0.6.RELEASE] at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) ~[tomcat-embed-core-8.5.31.jar:8.5.31] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-8.5.31.jar:8.5.31]

  因為是個json的格式,所以必須要有@ResponseBody

3、測試:在hello里面造個異常

package com.example.demo; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @Value("${gwf.name}") private String msg; @RequestMapping("/hello") public String hello() { int num = 1/0; return this.msg; } }

  結果:

二、自定義異常

1、首先創建自定義異常類:注意需要繼承extends RuntimeException

package com.example.demo.exception; public class BusinessException extends RuntimeException{ private String code; private String msg; public BusinessException(String code, String msg) { super(); this.code = code; this.msg = msg; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }

  這里介紹下idea自動生成get/set和構造函數的快捷鍵:alt + insert,然后選擇getter和setter,constructor,自動生成get、set方法和構造函數

2、然后就是自定義異常捕獲

package com.example.demo.exception; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import java.util.HashMap; import java.util.Map; /** * 全局捕獲異常類,只要作用在@RequestMapping上,所有的異常都會被捕獲 */ @ResponseBody @ControllerAdvice public class MyControllerAdvice { @ExceptionHandler(value = Exception.class) public Map<String,Object> errorHandle(Exception e){ Map<String,Object> map = new HashMap<String,Object>(); map.put("code",-1); map.put("msg",e.getMessage()); return map; } @ExceptionHandler(value = BusinessException.class) public Map<String,Object> errorHandle(BusinessException e){ Map<String,Object> map = new HashMap<String,Object>(); map.put("code",e.getCode()); map.put("msg",e.getMsg()); return map; } }

3、最后我們測試下:拋出自定義異常

package com.example.demo; import com.example.demo.exception.BusinessException; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @Value("${gwf.name}") private String msg; @RequestMapping("/hello") public String hello() { //int num = 1/0;
        throw new BusinessException("100","密碼錯誤"); //return this.msg;
 } }

  結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM