最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot使用ExceptionHandler做異常處理

 更新時(shí)間:2021年06月29日 09:05:15   作者:李曉LOVE向陽(yáng)  
這篇文章主要介紹了SpringBoot使用ExceptionHandler做異常處理,這篇文章通過(guò)多種方法案例來(lái)介紹該項(xiàng)技術(shù)的使用,需要的朋友可以參考下

應(yīng)用程序在運(yùn)行過(guò)程中,會(huì)有大量需要處理的異常。在頁(yè)面解析的一個(gè)工程中,會(huì)存在多個(gè)service類同時(shí)出現(xiàn)頁(yè)面解析異常和解析結(jié)果入庫(kù)異常,而這就表示在程序中需要一個(gè)機(jī)制,去統(tǒng)一處理這些異常,提供統(tǒng)一的異常處理。因?yàn)槲以O(shè)計(jì)這個(gè)結(jié)構(gòu)的主要目的是為了簡(jiǎn)化代碼。

在探尋spring的異常處理機(jī)制的時(shí)候,主要有三種方式來(lái)統(tǒng)一處理異常。三種方式都是使用的@ExceptionHandler注解。

@ExceptionHandler注解解釋:
當(dāng)一個(gè)Controller中有方法加了@ExceptionHandler之后,這個(gè)Controller其他方法中沒(méi)有捕獲的異常就會(huì)以參數(shù)的形式傳入加了@ExceptionHandler注解的那個(gè)方法中。

三種方式都需要首先為自己的系統(tǒng)設(shè)計(jì)一個(gè)自定義的異常類,通過(guò)它來(lái)傳遞狀態(tài)碼,以及一些其他參數(shù)信息。

public class ProcessException extends RuntimeException {
 
    private static final long serialVersionUID = 1L;
 
    // 任務(wù)明細(xì)ID
    protected String rwmxid;
 
    public ProcessException(String rwmxid) {
        this.rwmxid = rwmxid;
    }
 
    public String getRwmxid() {
        return rwmxid;
    }
 
    public void setRwmxid(String rwmxid) {
        this.rwmxid = rwmxid;
    }
    
}

第一種思路,設(shè)計(jì)一個(gè)基類。類中使用@ExceptionHandler注解 表明要做異常處理的方法

/**
 * Created by liuruijie.
 * 處理異常的類,需要處理異常的Controller直接繼承這個(gè)類
 */
public class BaseController {
    /**
     * 處理Controller拋出的異常
     * @param e 異常實(shí)例
     * @return Controller層的返回值
     */
    @ExceptionHandler
    @ResponseBody
    public Object expHandler(Exception e){
        if(e instanceof SystemException){
            SystemException ex= (SystemException) e;
            return WebResult.buildResult().status(ex.getCode())
                            .msg(ex.getMessage());
        }else{
            e.printStackTrace();
            return WebResult.buildResult().status(Config.FAIL)
                            .msg("系統(tǒng)錯(cuò)誤");
        }
    }
}

這種方式的缺點(diǎn)為:之后所有需要異常處理的Controller都繼承這個(gè)類,從而獲取到異常處理的方法。

雖然這種方式可以解決問(wèn)題,但是極其不靈活,因?yàn)閯?dòng)用了繼承機(jī)制就只為獲取一個(gè)默認(rèn)的方法,這顯然是不好的。

第二種方式,將這個(gè)基類變?yōu)榻涌?,提供此方法的默認(rèn)實(shí)現(xiàn)(也就是接口中的default方法,java8開(kāi)始支持接口方法的默認(rèn)實(shí)現(xiàn))

/**
 * Created by liuruijie.
 * 接口形式的異常處理
 */
public interface DataExceptionSolver {
    @ExceptionHandler
    @ResponseBody
    default Object exceptionHandler(Exception e){
        try {
            throw e;
        } catch (SystemException systemException) {
            systemException.printStackTrace();
            return WebResult.buildResult().status(systemException.getCode())
                    .msg(systemException.getMessage());
        } catch (Exception e1){
            e1.printStackTrace();
            return WebResult.buildResult().status(Config.FAIL)
                    .msg("系統(tǒng)錯(cuò)誤");
        }
    }
}

這種方式雖然沒(méi)有占用繼承,但是也不是很優(yōu)雅,因?yàn)閹缀跛械腃ontroller都需要進(jìn)行異常處理,于是我每個(gè)Controller都需要去寫implement DataExceptionSolver,這顯然不是我真正想要的。況且這種方式依賴java8才有的語(yǔ)法,這是一個(gè)很大的局限。

第三種方式,使用加強(qiáng)Controller做全局異常處理。

所謂加強(qiáng)Controller就是@ControllerAdvice注解,有這個(gè)注解的類中的方法的某些注解會(huì)應(yīng)用到所有的Controller里,其中就包括@ExceptionHandler注解。
于是可以寫一個(gè)全局的異常處理類:

/**
* @ClassName ExceptionHandle 
* @Description 統(tǒng)一處理控制層的異常
* @date 2020年3月14日 上午9:55:41 
* @version 1.0
 */
@ControllerAdvice
public class ExceptionHandle {
    private final Logger log = LoggerFactory.getLogger(getClass());
 
   @ExceptionHandler(ParseException.class)
   public void parseException(ParseException ex) {
       ex.printStackTrace();
       log.error("parseException ",ExceptionUtil.getMessage(ex));
 
       Map<String,Object> paraMap = new HashMap<String,Object>();
       paraMap.put("rwmxid", ex.getRwmxid());
       CommonUtil.updateDataLog(paraMap);
   }
   
 
   @ExceptionHandler(ProcessException.class)
   public void processException(ProcessException ex) {
       ex.printStackTrace();
       log.error("ProcessException ",ExceptionUtil.getMessage(ex));
 
       Map<String,Object> paraMap = new HashMap<String,Object>();
       paraMap.put("rwmxid", ex.getRwmxid());
       CommonUtil.updateDataLog(paraMap);
   }
   
 
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public TransEntity<?> error(Exception ex) {
        ex.printStackTrace();
        log.error("Exception ",ExceptionUtil.getMessage(ex));
        
        return TransEntity.error();
    }
    
}

如此,我們現(xiàn)在的Controller中的方法就可以很簡(jiǎn)潔了:

/**
 * Created by liuruijie on 2016/12/28.
 * 賬號(hào)
 */
@RestController
@RequestMapping("passport")
public class PassportController {
    PassportService passportService;
        @RequestMapping("login")
    public Object doLogin(HttpSession session, String username, String password){
        User user = passportService.doLogin(username, password);
        session.setAttribute("user", user);
        return WebResult.buildResult().redirectUrl("/student/index");
    }
}

在passprotService的doLogin方法中,可能會(huì)拋出用戶名或密碼錯(cuò)誤等異常,然后就會(huì)交由ExceptionHandle 去處理,直接返回異常信息給前端,然后前端也不需要關(guān)心是否返回了異常,因?yàn)檫@些都已經(jīng)定義好了。 

如果我們自定義了異常,也可以在指定拋出我們自定義的異常,然后在全局異常處理類中進(jìn)行處理, @ExceptionHandler(ParseException.class) 表明,會(huì)處理拋出的 ParseException 異常。

到此這篇關(guān)于SpringBoot使用ExceptionHandler做異常處理的文章就介紹到這了,更多相關(guān)SpringBoot使用ExceptionHandler內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java圖形化編程中的鍵盤事件設(shè)計(jì)簡(jiǎn)介

    Java圖形化編程中的鍵盤事件設(shè)計(jì)簡(jiǎn)介

    這篇文章主要介紹了Java圖形化編程中的鍵盤事件設(shè)計(jì),是Java的GUI編程當(dāng)中的基礎(chǔ)部分,需要的朋友可以參考下
    2015-10-10
  • java檢測(cè)redis是否可用的方法示例

    java檢測(cè)redis是否可用的方法示例

    這篇文章主要給大家介紹了關(guān)于java檢測(cè)redis是否可用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • SpringMVC使用ResponseEntity實(shí)現(xiàn)文件上傳下載

    SpringMVC使用ResponseEntity實(shí)現(xiàn)文件上傳下載

    這篇文章主要為大家介紹了SpringMVC使用ResponseEntity實(shí)現(xiàn)文件上傳下載,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 詳解全局事務(wù)注解@GlobalTransactional的識(shí)別

    詳解全局事務(wù)注解@GlobalTransactional的識(shí)別

    這篇文章主要為大家介紹了詳解全局事務(wù)注解@GlobalTransactional的識(shí)別源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Spring創(chuàng)建BeanDefinition之路徑掃描詳解

    Spring創(chuàng)建BeanDefinition之路徑掃描詳解

    這篇文章主要介紹了Spring創(chuàng)建BeanDefinition之路徑掃描方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • MyBatis攔截器如何自動(dòng)設(shè)置創(chuàng)建時(shí)間和修改時(shí)間

    MyBatis攔截器如何自動(dòng)設(shè)置創(chuàng)建時(shí)間和修改時(shí)間

    文章介紹了如何通過(guò)實(shí)現(xiàn)MyBatis的Interceptor接口,在實(shí)體類中自動(dòng)設(shè)置創(chuàng)建時(shí)間和修改時(shí)間,從而提高開(kāi)發(fā)效率
    2025-02-02
  • java中ExecutorService創(chuàng)建方法總結(jié)

    java中ExecutorService創(chuàng)建方法總結(jié)

    在本篇文章里小編給大家整理了一篇關(guān)于java中ExecutorService創(chuàng)建方法總結(jié),有興趣的朋友們可以參考下。
    2021-01-01
  • Win10?IDEA如何連接虛擬機(jī)中的Hadoop(HDFS)

    Win10?IDEA如何連接虛擬機(jī)中的Hadoop(HDFS)

    在虛擬機(jī)上配置Hadoop并修改core-site.xml文件,設(shè)置IP為局域網(wǎng)地址,IDEA中創(chuàng)建Maven項(xiàng)目,添加依賴,并檢查Hadoop重啟和端口轉(zhuǎn)發(fā),提供test.bat文件,通過(guò)修改IP簡(jiǎn)化使用過(guò)程
    2024-11-11
  • Java中的序列化機(jī)制詳細(xì)解讀

    Java中的序列化機(jī)制詳細(xì)解讀

    這篇文章主要介紹了Java中的序列化機(jī)制詳細(xì)解讀,序列化:將對(duì)象的狀態(tài)信息轉(zhuǎn)換為可以存儲(chǔ)或傳輸?shù)臄?shù)據(jù)形式(比如二進(jìn)制)的過(guò)程,反序列化:與序列化相對(duì),把序列化轉(zhuǎn)換成的可以存儲(chǔ)或傳輸?shù)臄?shù)據(jù)形式轉(zhuǎn)化為對(duì)象的狀態(tài)信息的過(guò)程,需要的朋友可以參考下
    2023-11-11
  • Java設(shè)計(jì)模式之外觀模式的實(shí)現(xiàn)方式

    Java設(shè)計(jì)模式之外觀模式的實(shí)現(xiàn)方式

    這篇文章主要介紹了Java設(shè)計(jì)模式之外觀模式的實(shí)現(xiàn)方式,外觀模式隱藏系統(tǒng)的復(fù)雜性,并向客戶端提供了一個(gè)客戶端可以訪問(wèn)系統(tǒng)的接口,這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它向現(xiàn)有的系統(tǒng)添加一個(gè)接口,來(lái)隱藏系統(tǒng)的復(fù)雜性,需要的朋友可以參考下
    2023-11-11

最新評(píng)論

策勒县| 文山县| 金溪县| 周至县| 万载县| 苏州市| 桦南县| 洛宁县| 沽源县| 惠安县| 库伦旗| 亚东县| 桐柏县| 青州市| 潜山县| 崇阳县| 土默特左旗| 巴楚县| 石门县| 泸定县| 合山市| 辽源市| 阿尔山市| 水城县| 苍山县| 德化县| 门源| 新津县| 华安县| 嘉峪关市| 凯里市| 柏乡县| 静安区| 石景山区| 宕昌县| 吉水县| 沙湾县| 武功县| 烟台市| 临夏县| 土默特右旗|