日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【学习笔记】springboot中的全局异常处理 和@ControllerAdvice的使用

發(fā)布時間:2024/9/30 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【学习笔记】springboot中的全局异常处理 和@ControllerAdvice的使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 全局異常處理
    • 例子
  • @ControllerAdvice的其他使用場景


全局異常處理

系統(tǒng)中異常包括:編譯時異常和運行時異常RuntimeException ,前者通過捕獲異常從而獲取異常信息,后者主要通過規(guī)范代碼開發(fā)、測試通過手段減少運行時異常的發(fā)生。在開發(fā)中,不管是dao層、service層還是controller層,都有可能拋出異常,在Springmvc中,能將所有類型的異常處理從各處理過程解耦出來,既保證了相關(guān)處理過程的功能較單一,也實現(xiàn)了異常信息的統(tǒng)一處理和維護。
SpringBoot全局異常處理方式主要兩種:
使用@ControllerAdvice 和@ExceptionHandler 注解
使用ErrorController類來實現(xiàn)
區(qū)別:

  • @ControllerAdvice 方式只能處理控制器拋出的異常。此時請求已經(jīng)進入控制器中。
  • ErrorController類方式可以處理所有的異常,包括未進入控制器的錯誤,比如404,401等錯誤
  • 如果應(yīng)用中兩者共同存在,則@ControllerAdvice 方式處理控制器拋出的異常,ErrorController類方式處理未進入控制器的異常。
  • @ControllerAdvice 方式可以定義多個攔截方法,攔截不同的異常類,并且可以獲取拋出的異常信息,自由度更大。
  • 例子

    GlobalException.java
    例一

    import com.xxxx.yebserver.pojo.RespBean; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import java.sql.SQLException; import java.sql.SQLIntegrityConstraintViolationException; /** * 全局異常 * * @author zhoubin * @since 1.0.0 */ @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(SQLException.class) public RespBean mySQLException(SQLException e) { if (e instanceof SQLIntegrityConstraintViolationException) { return RespBean.error("(唯一的鍵值重復(fù)了,)操作失敗!"); } return RespBean.error("數(shù)據(jù)庫異常,操作失敗!"); } }

    @ControllerAdvice :表示這是一個控制器增強類,當(dāng)控制器發(fā)生異常且符合類中定義的攔截異常類,將會被攔截
    @ExceptionHandler :定義攔截的異常類

    例二:

    @ControllerAdvice public class MyGlobalExceptionHandler { @ExceptionHandler(Exception.class) public ModelAndView customException(Exception e) { ModelAndView mv = new ModelAndView(); mv.addObject("message", e.getMessage()); mv.setViewName("myerror"); return mv; } }

    在該類中,可以定義多個方法,不同的方法處理不同的異常,例如專門處理空指針的方法、專門處理數(shù)組越界的方法…,也可以直接向上面代碼一樣,在一個方法中處理所有的異常信息。
    @ExceptionHandler 注解用來指明異常的處理類型,即如果這里指定為 NullpointerException,則數(shù)組越界異常不會進到這個方法來。

    @ControllerAdvice的其他使用場景

    全局數(shù)據(jù)綁定功能可以用來做一些初始化的數(shù)據(jù)操作,我們可以將一些公共的數(shù)據(jù)定義在添加了@ControllerAdvice 注解的類中,這樣,在每一個 Controller 的接口中,就都能夠訪問導(dǎo)致這些數(shù)據(jù)。

    @ControllerAdvice public class MyGlobalExceptionHandler { @ModelAttribute(name = "md") public Map<String,Object> mydata() { HashMap<String, Object> map = new HashMap<>(); map.put("age", 99); map.put("gender", "男"); return map; } }

    使用 @ModelAttribute 注解標記該方法的返回數(shù)據(jù)是一個全局數(shù)據(jù),默認情況下,這個全局數(shù)據(jù)的 key就是返回的變量名,value 就是方法返回值,當(dāng)然開發(fā)者可以通過@ModelAttribute 注解的 name 屬性去重新指定 key。
    定義完成后,在任何一個Controller 的接口中,都可以獲取到這里定義的數(shù)據(jù):

    @RestController public class HelloController { @GetMapping("/hello") public String hello(Model model) { Map<String, Object> map = model.asMap(); System.out.println(map); int i = 1 / 0; return "hello controller advice"; } }

    總結(jié)

    以上是生活随笔為你收集整理的【学习笔记】springboot中的全局异常处理 和@ControllerAdvice的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。