一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - SpringMVC 異常處理機(jī)制與自定義異常處理方式

SpringMVC 異常處理機(jī)制與自定義異常處理方式

2022-03-03 00:34許中寶 Java教程

這篇文章主要介紹了SpringMVC 異常處理機(jī)制與自定義異常處理方式,具有很好的開(kāi)車(chē)價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

本節(jié)介紹SpringMVC的異常處理機(jī)制

首先介紹SpringMVC默認(rèn)提供了一些HTTP錯(cuò)誤類似碼的默認(rèn)異常處理

如何給一個(gè)Controller自定義異常處理

如何為項(xiàng)目做一個(gè)全局異常處理

提到異常處理,就不得不提HandlerExceptionResolvers,我們的DispatcherServlet默認(rèn)設(shè)置三個(gè)異常處理器:

  • AnnotationMethodHandlerExceptionResolver:通過(guò)注解@ExceptionHandler實(shí)現(xiàn)異常理出
  • ResponseStatusExceptionResolver:通過(guò)注解@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)碼異常(或者說(shuō)交由其處理)

例如:我們自定義一個(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ì)使用提示語(yǔ):頁(yè)面未找到
 */
@ResponseStatus(code=HttpStatus.NOT_FOUND,reason="頁(yè)面未找到")
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ò)誤頁(yè)面提示是這樣的:好丑,但是有我們的reason

SpringMVC 異常處理機(jī)制與自定義異常處理方式

此方式只能實(shí)現(xiàn)簡(jiǎn)單的信息提示。

再來(lái)看看@ExceptionHandler

打開(kāi)上面被注釋掉的代碼,你會(huì)發(fā)現(xiàn)我們的錯(cuò)誤控制可以(轉(zhuǎn)發(fā))跳轉(zhuǎn)頁(yè)面了。

而且由于我們的這個(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) {
        //通過(guò)我們自定義異常處理器,繼承自HandlerExceptionResolver  來(lái)實(shí)現(xiàn)我們的異常處理
        //自定義我們的異常信息
        String  msg = "";
        //通過(guò)ModelAndView 來(lái)實(shí)現(xiàn)跳轉(zhuǎn)到我們的錯(cuò)誤頁(yè)面,并且將錯(cuò)誤信息帶回到頁(yè)面進(jìn)行顯示
        ModelAndView view = new ModelAndView();
        view.setViewName("error");
        //取出我們自定義的異常信息
        if(ex instanceof CustomerException){
            CustomerException exception = (CustomerException) ex;
            msg = exception.getExceptMsg();
        }else{
            //獲取我們的stringWriter來(lái)獲取我們的異常信息
            StringWriter writer = new StringWriter();
            PrintWriter printWriter = new PrintWriter(writer);
            //通過(guò)ex.printStackTrace(printWriter);來(lái)向我們的printWriter當(dāng)中輸入異常信息
            ex.printStackTrace(printWriter);
            msg = writer.toString();
        }
        //獲取到異常信息之后,通過(guò)短信,郵件等技術(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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 公交车揉捏大乳呻吟喘娇 | crdy在线看亚洲 | 欧美xingai| 国语精彩对白2021 | 精品国产午夜久久久久九九 | 久久综合狠狠综合狠狠 | 国产66| 午夜影院网站 | 秋葵丝瓜茄子草莓榴莲樱桃 | www毛片| 国产视频久久久 | 丝瓜视频黄色在线观看 | 亚洲一区二区精品推荐 | 我把寡妇日出水好爽 | 女明星放荡高h日常生活 | 天美传媒tm0087 | 火影小南被爆羞羞网站 | 天天爽天天操 | 九九99热久久999精品 | 天天做天天爱天天爽综合网 | 99久久免费视频 | 美女扒开胸罩露出奶了无遮挡免费 | 青草青青在线视频观看 | 楚乔传第二部全60集免费观看 | 亚洲第一网站免费视频 | 国模孕妇季玥337p人体 | 国产成人精品免费 | 3d动漫美女被吸乳羞羞有 | ass老妇黑森林pic | 91最新高端约会系列178 | tube69中国露脸 | 午夜办公室在线观看高清电影 | 青苹果乐园影院免费观看完整版 | 亚洲2023无矿砖码砖区 | 日韩影院在线观看 | 鸭子玩富婆流白浆视频 | 国产免费看视频 | 男男双性生子产乳高辣h | 91探花在线播放 | 色婷婷久久综合中文久久一本` | 美女无遮挡 |