本節(jié)介紹SpringMVC的異常處理機(jī)制
首先介紹SpringMVC默認(rèn)提供了一些HTTP錯(cuò)誤類似碼的默認(rèn)異常處理
如何給一個(gè)Controller自定義異常處理
如何為項(xiàng)目做一個(gè)全局異常處理
提到異常處理,就不得不提HandlerExceptionResolvers,我們的DispatcherServlet默認(rèn)設(shè)置三個(gè)異常處理器:
-
AnnotationMethodHandlerExceptionResolver
:通過注解@ExceptionHandler實(shí)現(xiàn)異常理出 -
ResponseStatusExceptionResolver
:通過注解@ResponseStatus處理HTTP請(qǐng)求的狀態(tài)碼異常 -
DefaultHandlerExceptionResolver
:處理Spring Exception并將其轉(zhuǎn)換為HTTP響應(yīng)狀態(tài)碼傳送的客戶端
SpringMVC默認(rèn)處理的幾種異常
Exception | HTTP Status Code |
---|---|
BindException |
400 (Bad Request) |
ConversionNotSupportedException |
500 (Internal Server Error) |
HttpMediaTypeNotAcceptableException |
406 (Not Acceptable) |
HttpMediaTypeNotSupportedException |
415 (Unsupported Media Type) |
HttpMessageNotReadableException |
400 (Bad Request) |
HttpMessageNotWritableException |
500 (Internal Server Error) |
HttpRequestMethodNotSupportedException |
405 (Method Not Allowed) |
MethodArgumentNotValidException |
400 (Bad Request) |
MissingServletRequestParameterException |
400 (Bad Request) |
MissingServletRequestPartException |
400 (Bad Request) |
NoHandlerFoundException |
404 (Not Found) |
NoSuchRequestHandlingMethodException |
404 (Not Found) |
TypeMismatchException |
400 (Bad Request) |
MissingPathVariableException |
500 (Internal Server Error) |
NoHandlerFoundException |
404 (Not Found) |
首先介紹的是注解@ResponseStatus
@ResponseStatus
用于自定義異常類上
該異常屬于某種HTTP錯(cuò)誤狀態(tài)碼異常(或者說交由其處理)
例如:我們自定義一個(gè)異常類:HttpStateCode404Exception,將其映射到404狀態(tài)碼
異常類:HttpStateCode404Exception.java
1
2
3
4
5
6
7
8
|
/** *使用@ResponseStatus只能實(shí)現(xiàn)簡(jiǎn)單的提示 *當(dāng)程序中拋出HttpStateCode404Exception會(huì)使用提示語:頁面未找到 */ @ResponseStatus (code=HttpStatus.NOT_FOUND,reason= "頁面未找到" ) public class HttpStateCode404Exception extends RuntimeException{ private static final long serialVersionUID = 1L; } |
然后我們?cè)谝粋€(gè)Controller類處理/handleException/存在在的映射路徑時(shí)的處理方法
1
2
3
4
5
6
7
8
9
10
11
12
|
@Controller @RequestMapping ( "handleException" ) public class HandleExceptionController { /*@ExceptionHandler({Throwable.class}) public String handleThisController(){ return "/handleException/404"; }*/ @RequestMapping ( "{url}" ) public void handle404(){ throw new HttpStateCode404Exception(); } } |
細(xì)心的讀者,一定會(huì)發(fā)現(xiàn),我在上面注掉的代碼使用了@ExceptionHandler注解
最終我們可以得到錯(cuò)誤頁面提示是這樣的:好丑,但是有我們的reason
此方式只能實(shí)現(xiàn)簡(jiǎn)單的信息提示。
再來看看@ExceptionHandler
打開上面被注釋掉的代碼,你會(huì)發(fā)現(xiàn)我們的錯(cuò)誤控制可以(轉(zhuǎn)發(fā))跳轉(zhuǎn)頁面了。
而且由于我們的這個(gè)方法定義在這個(gè)Controller類中,只要滿足此@ExceptionHandler定義的異常都會(huì)走這個(gè)方法。
注意:是這個(gè)Controller類中所有請(qǐng)求出現(xiàn)異常,且異常被其包含
我希望定義一個(gè)全局異常處理呢???@ControllerAdvice
為我們實(shí)現(xiàn)處理所以的控制器Controllers的異常
具體實(shí)現(xiàn)
1
2
3
4
5
6
7
8
9
10
11
|
/** * 定義一個(gè)處理所有Controllers的ExceptionHandler */ @ControllerAdvice public class GlobalExceptionAdvice { @ExceptionHandler ({HttpStateCode404Exception. class }) public String handleThisController(){ return "/handleException/404" ; } /*處理其他異常...*/ } |
異常處理的順序
1.Controller處理時(shí)拋出異常
2.本Controller類中的@ExceptionHandler如果捕獲到,就執(zhí)行其處理方法
3.否則,由全局異常捕獲處理
4.否則,由@ResponseStatus注解的異常捕獲處理
5.最后DefaultHandlerExceptionResolver處理
這恰恰也就是DispatcherServlet異常處理器的配置順序(循序調(diào)用,List)
自定義異常類(SpringMVC的異常處理)
SpringMVC當(dāng)中的異常處理–自定義異常處理類
①:自定義異常類
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class CustomerException extends Exception { //定義我們的異常信息 private String exceptMsg; public CustomerException(String exceptMsg){ this .exceptMsg = exceptMsg; } public String getExceptMsg() { return exceptMsg; } public void setExceptMsg(String exceptMsg) { this .exceptMsg = exceptMsg; } } |
②:自定義異常處理器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
import java.io.PrintWriter; import java.io.StringWriter; import javax.jws.WebParam.Mode; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.omg.CORBA.PRIVATE_MEMBER; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; public class CustomerExceptionResolver implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,Exception ex) { //通過我們自定義異常處理器,繼承自HandlerExceptionResolver 來實(shí)現(xiàn)我們的異常處理 //自定義我們的異常信息 String msg = "" ; //通過ModelAndView 來實(shí)現(xiàn)跳轉(zhuǎn)到我們的錯(cuò)誤頁面,并且將錯(cuò)誤信息帶回到頁面進(jìn)行顯示 ModelAndView view = new ModelAndView(); view.setViewName( "error" ); //取出我們自定義的異常信息 if (ex instanceof CustomerException){ CustomerException exception = (CustomerException) ex; msg = exception.getExceptMsg(); } else { //獲取我們的stringWriter來獲取我們的異常信息 StringWriter writer = new StringWriter(); PrintWriter printWriter = new PrintWriter(writer); //通過ex.printStackTrace(printWriter);來向我們的printWriter當(dāng)中輸入異常信息 ex.printStackTrace(printWriter); msg = writer.toString(); } //獲取到異常信息之后,通過短信,郵件等技術(shù),通知相關(guān)人員 view.addObject( "msg" , msg); return view; } } |
③:配置我們的異常處理器
1
2
|
<!-- 申明我們的異常解析處理類--> < bean id = "customerExceptionResolver" class = "cn.itcast.springmvc.exception.CustomerExceptionResolver" ></ bean > |
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://blog.csdn.net/qq_18675693/article/details/52317219