【Java開發(fā)】Java熱門框架深入開發(fā)第10篇:三、異常處理器【理解】,四、項目異常處理方案【理解】【附代碼文檔】

??????教程全知識點簡介:學(xué)習(xí)目標(biāo) 一、Spring簡介 2 初識Spring 3 Spring體系結(jié)構(gòu) 二、IOC和DI入門案例【重點】 五、Bean的生命周期【了解】 問題導(dǎo)入 1 生命周期相關(guān)概念介紹 2 代碼演示 3 Bean銷毀時機(jī) 六、依賴注入(DI配置) 1 依賴注入方式【重點】 2 依賴自動裝配【理解】 3 集合注入 今日目標(biāo) 一、第三方資源配置管理 1 管理DataSource連接池對象 2 加載properties屬性文件【重點】 四、Spring整合其他技術(shù)【重點】 二、AOP案例 1 案例-測量業(yè)務(wù)層接口萬次執(zhí)行效率 2 AOP切入點數(shù)據(jù)獲取 2 Spring事務(wù)角色【理解】 二、請求與響應(yīng) 1 請求映射路徑【重點】 2 請求參數(shù) 3 日期類型參數(shù)傳遞【重點】 4 響應(yīng) 三、REST風(fēng)格 1 REST簡介 2 RESTful入門案例 3 REST快速開發(fā)【重點】 今日內(nèi)容 一、SSM整合【重點】 1 SSM整合配置 三、異常處理器【理解】 1 異常介紹 2 異常處理器 一、分模塊開發(fā)與設(shè)計 1. 分模塊開發(fā)的意義 模塊拆分原則 2. 分模塊開發(fā)(模塊拆分) 二、依賴管理 1. 依賴傳遞 2. 可選依賴 4 可選依賴和排除依賴的區(qū)別 三、聚合與繼承 1. 聚合工程 3. 繼承關(guān)系 5. 聚合與繼承的區(qū)別 四、屬性管理 1. 屬性 2. 版本管理 五、多環(huán)境配置與應(yīng)用 1. 多環(huán)境配置作用 2. 跳過測試(了解) 六、私服 2. 私服倉庫分類 3. 資源上傳與下載 附件1:POM文件總體配置說明 一、MyBatisPlus簡介 1. 入門案例 二、標(biāo)準(zhǔn)數(shù)據(jù)層開發(fā) 2. Lombok插件介紹 四、DML編程控制 1. id生成策略控制(Insert) 2. 多記錄操作(批量Delete/Select) 3. 邏輯刪除(Delete/Update) 4. 樂觀鎖(Update)


????倉庫code.zip ??直接-->:???https://gitlab.com/yiqing112/backend/-/blob/main/Java/Java熱門框架深入開發(fā)/note.md ???????

? 本教程項目亮點

?? 知識體系完整:覆蓋從基礎(chǔ)原理、核心方法到高階應(yīng)用的全流程內(nèi)容
?? 全技術(shù)鏈覆蓋:完整前后端技術(shù)棧,涵蓋開發(fā)必備技能
?? 從零到實戰(zhàn):適合 0 基礎(chǔ)入門到提升,循序漸進(jìn)掌握核心能力
?? 豐富文檔與代碼示例:涵蓋多種場景,可運行、可復(fù)用
?? 工作與學(xué)習(xí)雙參考:不僅適合系統(tǒng)化學(xué)習(xí),更可作為日常開發(fā)中的查閱手冊
?? 模塊化知識結(jié)構(gòu):按知識點分章節(jié),便于快速定位和復(fù)習(xí)
?? 長期可用的技術(shù)積累:不止一次學(xué)習(xí),而是能伴隨工作與項目長期參考


??????全教程總章節(jié)


??????本篇主要內(nèi)容

三、異常處理器【理解】

問題導(dǎo)入

問題1:項目各個個層級均可能出現(xiàn)異常,異常處理代碼書寫在哪一層?

1 異常介紹

  • 程序開發(fā)過程中不可避免的會遇到異?,F(xiàn)象, 不能讓用戶看到這樣的頁面數(shù)據(jù)
  • 出現(xiàn)異?,F(xiàn)象的常見位置與常見誘因如下:
    • 框架內(nèi)部拋出的異常:因使用不合規(guī)導(dǎo)致
    • 數(shù)據(jù)層拋出的異常:因外部服務(wù)器故障導(dǎo)致(例如:服務(wù)器訪問超時)
    • 業(yè)務(wù)層拋出的異常:因業(yè)務(wù)邏輯書寫錯誤導(dǎo)致(例如:遍歷業(yè)務(wù)書寫操作,導(dǎo)致索引異常等)
    • 表現(xiàn)層拋出的異常:因數(shù)據(jù)收集、校驗等規(guī)則導(dǎo)致(例如:不匹配的數(shù)據(jù)類型間導(dǎo)致異常)
    • 工具類拋出的異常:因工具類書寫不嚴(yán)謹(jǐn)不夠健壯導(dǎo)致(例如:必要釋放的連接長期未釋放等)

2 異常處理器

2.2.1 編寫異常處理器

@RestControllerAdvice  //用于標(biāo)識當(dāng)前類為REST風(fēng)格對應(yīng)的異常處理器
public class ProjectExceptionAdvice {

    //統(tǒng)一處理所有的Exception異常
    @ExceptionHandler(Exception.class)
    public Result doOtherException(Exception ex){
        return new Result(666,null);
    }
}

使用異常處理器之后的效果

2.2.2 @RestControllerAdvice注解介紹

  • 名稱:@RestControllerAdvice

  • 類型:==類注解==

  • 位置:Rest風(fēng)格開發(fā)的控制器增強類定義上方

  • 作用:為Rest風(fēng)格開發(fā)的控制器類做增強

  • 說明:此注解自帶@ResponseBody注解與@Component注解,具備對應(yīng)的功能

2.2.3 @ExceptionHandler注解介紹

  • 名稱:@ExceptionHandler
  • 類型:==方法注解==
  • 位置:專用于異常處理的控制器方法上方
  • 作用:設(shè)置指定異常的處理方案,功能等同于控制器方法,出現(xiàn)異常后終止原始控制器執(zhí)行,并轉(zhuǎn)入當(dāng)前方法執(zhí)行
  • 說明:此類方法可以根據(jù)處理的異常不同,制作多個方法分別處理對應(yīng)的異常

四、項目異常處理方案【理解】

問題導(dǎo)入

請說出項目當(dāng)前異常的分類以及對應(yīng)類型異常該如何處理?

1 項目異常分類

  • 業(yè)務(wù)異常(BusinessException)
    • 規(guī)范的用戶行為產(chǎn)生的異常
    • 不規(guī)范的用戶行為操作產(chǎn)生的異常
  • 系統(tǒng)異常(SystemException)
    • 項目運行過程中可預(yù)計且無法避免的異常
  • 其他異常(Exception)
    • 編程人員未預(yù)期到的異常

2 項目異常處理方案

  • 業(yè)務(wù)異常(BusinessException)
    • ==發(fā)送對應(yīng)消息傳遞給用戶,提醒規(guī)范操作==
  • 系統(tǒng)異常(SystemException)
    • ==發(fā)送固定消息傳遞給用戶,安撫用戶==
    • 發(fā)送特定消息給運維人員,提醒維護(hù)
    • 記錄日志
  • 其他異常(Exception)
    • ==發(fā)送固定消息傳遞給用戶,安撫用戶==
    • 發(fā)送特定消息給編程人員,提醒維護(hù)(納入預(yù)期范圍內(nèi))
    • 記錄日志

3 項目異常處理代碼實現(xiàn)

3.1 根據(jù)異常分類自定義異常類

3.1.1 自定義項目系統(tǒng)級異常
//自定義異常處理器,用于封裝異常信息,對異常進(jìn)行分類
public class SystemException extends RuntimeException{
    private Integer code;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public SystemException(Integer code, String message) {
        super(message);
        this.code = code;
    }

    public SystemException(Integer code, String message, Throwable cause) {
        super(message, cause);
        this.code = code;
    }
}
3.1.2 自定義項目業(yè)務(wù)級異常
//自定義異常處理器,用于封裝異常信息,對異常進(jìn)行分類
public class BusinessException extends RuntimeException{
    private Integer code;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public BusinessException(Integer code, String message) {
        super(message);
        this.code = code;
    }

    public BusinessException(Integer code,String message,Throwable cause) {
        super(message, cause);
        this.code = code;
    }
}

3.2 自定義異常編碼(持續(xù)補充)

public class Code {

    //之前其他狀態(tài)碼省略沒寫,以下是新補充的狀態(tài)碼,可以根據(jù)需要自己補充
    
    public static final Integer SYSTEM_ERR = 50001;
    public static final Integer SYSTEM_TIMEOUT_ERR = 50002;
    public static final Integer SYSTEM_UNKNOW_ERR = 59999;
    public static final Integer BUSINESS_ERR = 60002;
    
}

3.3 觸發(fā)自定義異常

@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private BookDao bookDao;

    //在getById演示觸發(fā)異常,其他方法省略沒有寫進(jìn)來
    public Book getById(Integer id) {
        //模擬業(yè)務(wù)異常,包裝成自定義異常
        if(id <0){
            throw new BusinessException(Code.BUSINESS_ERR,"請不要使用你的技術(shù)挑戰(zhàn)我的耐性!");
        }
    }
}

Vavr 函數(shù)式庫

3.4 在異常通知類中攔截并處理異常

Java67 博客

Jenkov Java 教程

@RestControllerAdvice //用于標(biāo)識當(dāng)前類為REST風(fēng)格對應(yīng)的異常處理器
public class ProjectExceptionAdvice {
    //@ExceptionHandler用于設(shè)置當(dāng)前處理器類對應(yīng)的異常類型
    @ExceptionHandler(SystemException.class)
    public Result doSystemException(SystemException ex){
        //記錄日志
        //發(fā)送消息給運維
        //發(fā)送郵件給開發(fā)人員,ex對象發(fā)送給開發(fā)人員
        return new Result(ex.getCode(),null,ex.getMessage());
    }

    @ExceptionHandler(BusinessException.class)
    public Result doBusinessException(BusinessException ex){
        return new Result(ex.getCode(),null,ex.getMessage());
    }

    //除了自定義的異常處理器,保留對Exception類型的異常處理,用于處理非預(yù)期的異常
    @ExceptionHandler(Exception.class)
    public Result doOtherException(Exception ex){
        //記錄日志
        //發(fā)送消息給運維
        //發(fā)送郵件給開發(fā)人員,ex對象發(fā)送給開發(fā)人員
        return new Result(Code.SYSTEM_UNKNOW_ERR,null,"系統(tǒng)繁忙,請稍后再試!");
    }
}

測試:在postman中發(fā)送請求訪問getById方法,傳遞參數(shù)-1,得到以下結(jié)果:

![image-20210805173815730](images/image-202108051738

五、SSM整合頁面開發(fā)【重點】

1 準(zhǔn)備工作

為了確保靜態(tài)資源能夠被訪問到,需要設(shè)置靜態(tài)資源過濾

Dropwizard 文檔

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/pages/**")
            .addResourceLocations("/pages/");
        registry.addResourceHandler("/css/**")
            .addResourceLocations("/css/");
        registry.addResourceHandler("/js/**")
            .addResourceLocations("/js/");
        registry.addResourceHandler("/plugins/**")
            .addResourceLocations("/plugins/");
    }
}

Quarkus 文檔

JSON-B API

2 列表查詢功能

  • 前端代碼
//列表
getAll() {
    //發(fā)送ajax請求
    axios.get("/books").then((res)=>{
        this.dataList = res.data.data;
    });
}

Spring Data JPA 文檔

3 添加功能

  • 前端代碼

Micronaut 文檔

//彈出添加窗口
handleCreate() {
    this.dialogFormVisible = true;
    this.resetForm();
},
//重置表單
resetForm() {
    this.formData = {};
},
//添加
handleAdd () {
    //發(fā)送ajax請求
    axios.post("/books",this.formData).then((res)=>{
        console.log(res.data);
        //如果操作成功,關(guān)閉彈層,顯示數(shù)據(jù)
        if(res.data.code == 20011){
            this.dialogFormVisible = false;
            this.$message.success("添加成功");
        }else if(res.data.code == 20010){
            this.$message.error("添加失敗");
        }else{
            this.$message.error(res.data.msg);
        }
    }).finally(()=>{
        this.getAll();
    });
},
  • 后臺代碼改進(jìn)
@Service
public class BookServiceImpl implements BookService {
    @Autowire
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容