国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

SSM全局異常處理——兩種實用實現(xiàn)方案

int64 / 2627人閱讀

摘要:本人也處于學(xué)習(xí)的階段,發(fā)表此文章也是希望能夠得到更多的技術(shù)交流和幫助,文中的不足還有勞大家指出全局異常處理兩種實用實現(xiàn)方案

## SSM全局異常處理——兩種實用實現(xiàn)方案 ##

先前做項目時自己不是很門清這塊,在網(wǎng)上查閱資料后發(fā)現(xiàn)資料也不是很全面,因此自己摸索出來后就想著趕緊給大家分享一下,盡管此技術(shù)點很基礎(chǔ),但是希望能夠幫到大家。

為什么實現(xiàn):

在我們的項目運行過程中,無法完全避免出現(xiàn)一些位置的運行時異常(比如NullPointerException?),而恰恰我們并沒有對該異常進行處理,那么就會將此異常拋向用戶。

當(dāng)用戶瀏覽頁面時突然眼前蹦出一堆看不懂的“外星文”,可想而知用戶的體驗度是非常差的。

而如果簡單的配置一下異常處理的話可以在web.xml中進行配置異常后跳轉(zhuǎn)的頁面,例如404

  
       404
       /404err.jsp
   

? ? ? ? ? ? 這種方法現(xiàn)在已經(jīng)low到爆哦,如果我們是json請求呢?因此我們需要自己實現(xiàn)一套完美的異常處理,保證我們系統(tǒng)是健壯的!

?

?
springmvc HandlerExceptionResolver異常處理器:
今天我們就在springmvc的這個接口上進行一番操作(異常處理器啥是?)

public class SpringExceptionResolver implements HandlerExceptionResolver {
 
    @Override
    public ModelAndView resolveException(HttpServletRequest request,
 HttpServletResponse response, Object handler, Exception ex) {

參數(shù):

? ? ? request:當(dāng)前請求

? ? ? response:當(dāng)前響應(yīng)對象

? ? ? ex: 當(dāng)本次方法執(zhí)行異常,這個參數(shù)就是當(dāng)前異常對象

?

?
實現(xiàn)方式A——根據(jù)請求類型,選擇不同的異常處理方式(不要忽略代碼注釋哦)
我們項目中的請求在一種角度可上分頁面請求、json請求。因此根據(jù)請求類型,選擇不同的異常處理方式就可以理解為:如果是頁面請求異常了,我們就選擇頁面請求異常處理來返回錯誤信息。如果是json請求異常,那么就以json的形式返回。

?

開始前準(zhǔn)備兩個異常類型,為我們手動拋異常能區(qū)分開請求類型
CustomException:使用場景是前臺發(fā)送json請求,那么我們在該請求的service層拋出CustomException,前臺就會收到異常信息。

/**
 * 如果拋出此異常,系統(tǒng)會以json格式向前臺返回異常信息
 * 使用方式: throw new CustomException("這里填入異常信息,會發(fā)送到前臺");
 */
public class CustomException extends Exception{
    private static final long serialVersionUID = -1668707977736987938L;
    //異常信息
    public String message;
    public CustomException (String message) {
        super(message);
        this.message = message;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
}

?

/**
* @ClassName: ReturnViewException 
* @Description: 此異常類型用來向前臺返回頁面
 */
public class ReturnViewException extends Exception{
 
    private static final long serialVersionUID = -1668707977736987938L;
 
    //異常信息
    public String message;
 
    public ReturnViewException (String message) {
        super(message);
        this.message = message;
    }
 
    public String getMessage() {
        return message;
    }
 
    public void setMessage(String message) {
        this.message = message;
    }
}

?

public class IntegrateException implements HandlerExceptionResolver {
 
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
            Exception ex) {
        //判斷是否為ajax請求,默認不是
        boolean isAjaxRequest = false;  
        //這段代碼能夠得知是否為ajax請求,也就是我們說的json請求
        if(!StringUtils.isBlank(request.getHeader("x-requested-with")) && request.getHeader("x-requested-with").equals("XMLHttpRequest")){  
            isAjaxRequest = true; 
        }
        //如果是ajax請求
        if(isAjaxRequest) {
            CustomException  customException = null;
            if(ex instanceof CustomException) {
                customException = (CustomException) ex;
            }else {
                //如果拋出的不是系統(tǒng)自定義的異常則重新構(gòu)造一個未知錯誤異常
                //這里我就也有CustomException省事了,實際中應(yīng)該要再定義一個新的異常
                customException = new CustomException ("系統(tǒng)未知錯誤,請聯(lián)系管理員");
            }
             String message = customException.getMessage();
             //向前臺返回錯誤信息
             ModelAndView model = new ModelAndView();
             FastJsonJsonView view = new FastJsonJsonView();
             Map map = new HashMap();
             map.put("code", 5000);
             map.put("message", message);
             view.setAttributesMap(map);
             model.setView(view);
             return model;
        }else {
            //如果不是ajax請求 那么異常后需要返回頁面
            ReturnViewException returnViewException = null;
            //如果拋出的異常類型是我們預(yù)想的,會想前臺返回我們指定在參數(shù)里的頁面
            if(ex instanceof ReturnViewException) {
                returnViewException = (ReturnViewException) ex;
            }else {
                //這里的500是我資源下的500.jsp,使用了mvc的映射省去了前綴后綴
                //系統(tǒng)默認跳轉(zhuǎn)到500頁面
                returnViewException = new ReturnViewException("500"); 
            }
             ModelAndView model = new ModelAndView();
             model.setViewName(returnViewException.getMessage());
             return model;
        }
    }
}

在此同時我們需要在springmvc.xml中配置我們的全局異常處理類,bean id別隨意更改..

現(xiàn)在就可以開始使用了~~~~

手動使用:

throw new CustemException("錯誤了"); //向前臺返回 "錯誤了" 異常信息
throw new ReturnViewException("500err") //前臺重定向到500err.jsp

當(dāng)然出現(xiàn)未知異常后,回自動向前臺返回我們默認的異常信息

?
實現(xiàn)方式B——自定義項目接口規(guī)則,判斷特定的異常處理方式
實現(xiàn)的主要原理更簡單明亮:

方才A方案是判斷請求類型,這里我們更加暴力,假如我規(guī)定項目的json請求全部以 .json結(jié)尾,頁面請求全部以 .page結(jié)尾,那么我們就可以在異常處理器攔截到異常時,判斷請求的后綴來決定怎么處理了。不同點就在這里,但是雖然A復(fù)雜點,我還是推薦使用A

好,拋代碼,這是springmvc.xml

   
    
    
    
    

?

創(chuàng)建異常類(這個東西,根據(jù)需要判多少種異常類型,我們可以創(chuàng)很多的,不僅限于一兩個)

public class ParamException extends RuntimeException {
    public ParamException() {
        super();
    }
 
    public ParamException(String message) {
        super(message);
    }
 
    public ParamException(String message, Throwable cause) {
        super(message, cause);
    }
 
    public ParamException(Throwable cause) {
        super(cause);
    }
 
    protected ParamException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}
public class PermissionException extends RuntimeException {
 
    public PermissionException() {
        super();
    }
 
    public PermissionException(String message) {
        super(message);
    }
 
    public PermissionException(String message, Throwable cause) {
        super(message, cause);
    }
 
    public PermissionException(Throwable cause) {
        super(cause);
    }
 
    protected PermissionException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

然后我們上最關(guān)鍵的異常處理器

public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        String url = request.getRequestURL().toString();
        ModelAndView mv;
        String defaultMsg = "System error";
 
        // 這里我們要求項目中所有請求json數(shù)據(jù),都使用.json結(jié)尾
        if (url.endsWith(".json")) {
            if (ex instanceof PermissionException || ex instanceof ParamException) {
                JsonData result = JsonData.fail(ex.getMessage());
                mv = new ModelAndView("jsonView", result.toMap());
            } else {
                log.error("unknown json exception, url:" + url, ex);
                JsonData result = JsonData.fail(defaultMsg);
                mv = new ModelAndView("jsonView", result.toMap());
            }
        } else if (url.endsWith(".page")){ // 這里我們要求項目中所有請求page頁面,都使用.page結(jié)尾
            log.error("unknown page exception, url:" + url, ex);
            JsonData result = JsonData.fail(defaultMsg);
            mv = new ModelAndView("exception", result.toMap());
        } else {
            log.error("unknow exception, url:" + url, ex);
            JsonData result = JsonData.fail(defaultMsg);
            mv = new ModelAndView("jsonView", result.toMap());
        }
 
        return mv;
    }

結(jié)束語:

這就是我整理出來的兩種ssm全局異常處理方式了,希望能夠幫助到大家。本人也處于學(xué)習(xí)的階段,發(fā)表此文章也是希望能夠得到更多的技術(shù)交流和幫助,文中的不足還有勞大家指出!

SSM全局異常處理——兩種實用實現(xiàn)方案

csdn:https://blog.csdn.net/qq_4182...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/73513.html

相關(guān)文章

  • Java后端

    摘要:,面向切面編程,中最主要的是用于事務(wù)方面的使用。目標(biāo)達成后還會有去構(gòu)建微服務(wù),希望大家多多支持。原文地址手把手教程優(yōu)雅的應(yīng)用四手把手實現(xiàn)后端搭建第四期 SpringMVC 干貨系列:從零搭建 SpringMVC+mybatis(四):Spring 兩大核心之 AOP 學(xué)習(xí) | 掘金技術(shù)征文 原本地址:SpringMVC 干貨系列:從零搭建 SpringMVC+mybatis(四):Sp...

    joyvw 評論0 收藏0
  • spring中的統(tǒng)一異常處理

    摘要:首先,定義一個存放異常處理函數(shù)的類,并使用修飾。修飾的方法的寫法和內(nèi)的異常處理函數(shù)寫法是一樣的。控制生效的范圍注意到,我是這樣編寫注解的它用來限定這些異常處理函數(shù)起作用的的范圍。使用的機制,做統(tǒng)一異常處理。 在具體的SSM項目開發(fā)中,由于Controller層為處于請求處理的最頂層,再往上就是框架代碼的。因此,肯定需要在Controller捕獲所有異常,并且做適當(dāng)處理,返回給前端一個友...

    paraller 評論0 收藏0
  • 移動商城項目【總結(jié)】

    摘要:有必要建一個資源服務(wù)器存放靜態(tài)資源。一些用戶級別的數(shù)據(jù)輕量可以考慮存儲在中。存儲的是值,可以通過來對和對象之間的轉(zhuǎn)換如果我們的數(shù)據(jù)是在后臺傳過去或者轉(zhuǎn)換而成的,在前臺上并沒有做什么改變的話。 移動商城項目總結(jié) 移動商城項目是我第二個做得比較大的項目,該項目系統(tǒng)來源于傳智Java168期,十天的視頻課程(想要視頻的同學(xué)關(guān)注我的公眾號就可以直接獲取了) 通過這次的項目又再次開闊了我的視野,...

    BlackHole1 評論0 收藏0
  • SpringBoot搭建一個SSM開發(fā)框架(二)

    摘要:接著上一篇,我們在測試可以允許后,我們接著來寫一個查詢功能,一連接數(shù)據(jù)庫的查詢例子我來看看項目的結(jié)構(gòu)頂級父項目公司默認有的父項目數(shù)據(jù)層 接著上一篇,我們在測試web可以允許后,我們接著來寫一個查詢功能, 一、 連接數(shù)據(jù)庫的查詢例子 我來看看項目的結(jié)構(gòu): tx-parent 頂級父項目(公司默認有的) |- tx-manager ------------------------...

    Nosee 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<