springboot區域性及全域性異常處理
區域性異常處理
對TestController類進行操作
(1)、創造異常點
如果設定一個變數=整數/0,則會發生ArithmeticException異常
在TestController中加入除0異常點
@RequestMapping("/hello1")
public String hello(){
// 自己編寫的除0異常
int a=1/0;
return "hello1";
}
(2)、編寫異常處理方法
在TestController中加入異常處理方法
//區域性異常處理 @ExceptionHandler(Exception.class) public String exHandler(Exception e){ // 判斷髮生異常的型別是除0異常則做出響應 if(e instanceof ArithmeticException){ return "發生了除0異常"; } // 未知的異常做出響應 return "發生了未知異常"; }
(3)、測試
輸入地址:http://localhost:8080/test/hello1
如果顯示:發生了除0異常,則測試成功
全域性異常處理
(1)、建立一個新的Controller類
包名:package com.springboot.controller;
類名:TestGlobalController
package com.springboot.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/test") public class TestGlobalController { @RequestMapping("/hello2") public String hello2(){ // 自己編寫的異常發生點 int a=1/0; return "hello2"; } }
(2)、編寫全域性異常類
包名:com.springboot.controller.exception
類名:GlobalDefaultExceptionHandler
⒈全域性異常處理返回字串
package com.springboot.controller.exception; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; @ControllerAdvice public class GlobalDefaultExceptionHandler { // 全域性異常處理返回字串 @ExceptionHandler(Exception.class) @ResponseBody public String exception(Exception e){ // 判斷髮生異常的型別是除0異常則做出響應 if(e instanceof ArithmeticException){ return "全域性:發生了除0異常"; } // 未知的異常做出響應 return "全域性:發生了未知異常"; } }
⒉全域性異常處理返回JSON
// 全域性異常處理返回JSON
@ExceptionHandler(Exception.class)
@ResponseBody
public Map<String,Object> exception(Exception e){
Map<String,Object> map=new HashMap<String,Object>();
// 判斷髮生異常的型別是除0異常則做出響應
if(e instanceof ArithmeticException){
map.put("codeNumber", "1");
map.put("message", e.getMessage());
return map;
}
// 未知的異常做出響應
map.put("codeNumber", "0");
map.put("message", e.getMessage());
return map;
}
⒊全域性異常處理返回JSP
@ExceptionHandler(Exception.class)
public String exception(Exception e){
// 判斷髮生異常的型別是除0異常則做出響應
if(e instanceof ArithmeticException){
// 跳轉到test.jsp頁面
return "test";
}
// 未知的異常做出響應
// 跳轉到test.jsp頁面
return "test";
}
注:需要配置一下才能支援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
新增application.properties檔案,然後往其中寫入
# 頁面預設字首目錄
spring.mvc.view.prefix=/WEB-INF/
# 響應頁面預設字尾
spring.mvc.view.suffix=.jsp
③需要新增jsp檔案
新增JSP,放置在src/main/webapp/WEB-INF目錄下
--------------------------------------------------------------------------------------
(3)、全域性異常類應用範圍設定
⒈@ControllerAdvice簡介
在spring 3.2中,新增了@ControllerAdvice 註解可以用於定義@ExceptionHandler、@InitBinder、@ModelAttribute,並應用到所有@RequestMapping中。
這裡我們全域性異常只應用到@ExceptionHandler
⒉設定@ControllerAdvice應用範圍
設定了@ControllerAdvice應用範圍,即就設定了異常類的應用範圍
@ControllerAdvice的範圍有:
①basePackages:應用在xx包
②basePackageClasses:應用在xx類
③assignableTypes:應用在加了@Controller的類
④annotations:應用在帶有xx註解的類或者方法
————————————————————
≥簡單用法例子:
————————————————————
@ControllerAdvice(basePackages={"com.springboot.controller"})
只捕捉com.springboot.controller包中的異常
@ControllerAdvice(basePackageClasses={TestController.class})
只捕捉TestController.class中的異常
@ControllerAdvice(assignableTypes={TestController.class})
只捕捉TestController.class中的異常
@ControllerAdvice(annotations=TestException.class)
只捕捉帶有@TestException註解的類
上面四個註解一個應用包,然後的兩個用在類,而最後一個只應用於帶有XX註解的類
--------------------------------------------------------------------------------------
3.講講應用在註解怎麼寫
1、建立一個註解類
package com.springboot.annotation;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
// 這種型別的Annotations將被JVM保留,所以他們能在執行時被JVM或其他使用反射
@Retention(RUNTIME)
// 目標型別可以應用在方法
@Target(ElementType.TYPE)
// 對doc文件支援
@Documented
public @interface TestException {
}
---------------------------------------------------------------------------------
注:關於註解類的簡說請看:
https://my.oschina.net/u/3523885/blog/1489959
---------------------------------------------------------------------------------
2、將註解加到TestController類
加入@TestException註解
// 加入TestException註解
@TestException
@RestController
@RequestMapping("/test")
public class TestController {
@RequestMapping("/hello1")
public String hello(){
// 自己編寫的除0異常
int a=1/0;
return "hello1";
}
}
3、TestController類不加註解
@RestController
@RequestMapping("/test")
public class TestGlobalController {
@RequestMapping("/hello2")
public String hello(){
// 自己編寫的除0異常
int a=1/0;
return "hello2";
}
}
4、設定異常類只捕捉帶有@TestException註解的類的異常
// 設定範圍應用於帶有@TestException的註解的類上
@ControllerAdvice(annotations={TestException.class})
public class GlobalDefaultExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
public String exceptionReturnString(Exception e){
// 判斷髮生異常的型別是除0異常則做出響應
if(e instanceof ArithmeticException){
return "全域性:發生了除0異常";
}
// 未知的異常做出響應
return "全域性:發生了未知異常";
}
}
5、測試
輸入地址:http://localhost:8080/test/hello1
輸入地址:http://localhost:8080/test/hello2
(4)、處理404錯誤
因為404錯誤是不經過controller的,所以無法通過上述辦法處理。但是 SpringBoot 預設提供了一個全域性的 handler 來處理所有的 HTTP 錯誤, 並把它對映為 /error。當發生一個 HTTP 錯誤, 例如 404 錯誤時, SpringBoot 內部的機制會將頁面重定向到 /error 中。
所以我們只要實現一個 /error 對映的 Controller 即可來處理它即可
1、建立404.jsp頁面
在WEB-IFN下建立errorpages目錄,並且在此目錄下建立一個404.jsp頁面
目錄:
404.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Test JSP</title>
</head>
<body>
<span>發生了404錯誤</span>
</html>
2、建立處理404的controller類
包名:package com.springboot.controller;
類名:HttpErrorController
package com.springboot.controller;
import org.springframework.boot.autoconfigure.web.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HttpErrorController implements ErrorController {
private static final String ERROR_PATH = "/error";
@RequestMapping(value=ERROR_PATH)
public String handleError(){
return "errorpage/404";
}
@Override
public String getErrorPath() {
return ERROR_PATH;
}
}
3、測試
隨便輸入個地址測試引發404錯誤
例如輸入地址:http://localhost:8080/-.-
顯示: