摘要:看成提供的一個特殊的攔截器。是一個,用于定義最主要用途,和方法,適用于所有使用方法攔截。為所有封裝統一異常處理代碼。為所有設置全局變量。用于為所有設置某個類型的數據轉換器。
Spring3.2開始提供的新注解,控制器增強(AOP),最主要的應用是做統一的異常處理。@ControllerAdvice(看成spring mvc提供的一個特殊的攔截器)。
@ControllerAdvice是一個@Component,用于定義@ExceptionHandler(最主要用途),@InitBinder和@ModelAttribute方法,適用于所有使用@RequestMapping方法(攔截)。
引申:@interface 元注解
@Target(ElementType.TYPE) :該注解應用到什么地方。
@Retention(RetentionPolicy.RUNTIME):什么時候應用。
@ExceptionHandler:為所有controller封裝統一異常處理代碼。
@ModelAttribute:為所有controller設置全局變量。
@InitBinder:用于為所有controller設置某個類型的數據轉換器。
準備:搭建好Spring Boot,頁面使用thymeleaf
1.全局異常捕捉處理ControllerAdviceTest.java
/** * 啟動應用后,被 @ExceptionHandler、@InitBinder、@ModelAttribute 注解的方法, * 都會作用在 被 @RequestMapping 注解的方法上 */ @ControllerAdvice public class ControllerAdviceTest { /** * 全局異常捕捉處理 * @ExceptionHandler 用來定義函數針對的異常類型 * @param ex * @return */ @ResponseBody @ExceptionHandler(value = Exception.class) public Map errorHandler(Exception ex){ Map map = new HashMap(); map.put("code","0000"); map.put("msg",ex.getMessage()); return map; } }
ExceptionController.java
@RestController public class ExceptionController { @RequestMapping("exception1") public String exception1() throws IOException { return "攔截器測試"; } }
瀏覽器訪問:localhost:8080/exception1
瀏覽器顯示:攔截器測試
@RestController public class ExceptionController { @RequestMapping("exception2") public String exception2() throws IOException { int i = 1/0; return "攔截器測試"; } }
瀏覽器訪問:localhost:8080/exception2
瀏覽器顯示:{"msg":"/ by zero","code":"0000"}
@RestController public class ExceptionController { @RequestMapping("exception3") public String exception3() throws IOException { throw new NullPointerException("服務器到非洲去了"); } }
瀏覽器訪問:localhost:8080/exception3
瀏覽器顯示:{"msg":"服務器到非洲去了","code":"0000"}
2.攔截捕捉自定義異常MyException.java
public class MyException extends RuntimeException { private String code; private String msg; //Get、Set方法略…… public MyException(String code,String msg) { this.code = code; this.msg = msg; } }
ControllerAdviceTest.java
@ControllerAdvice public class ControllerAdviceTest { /** * 攔截捕捉自定義異常 MyException.class * @param ex * @return */ @ResponseBody @ExceptionHandler(value = MyException.class) public Map myErrorHandler(MyException ex) { Map map = new HashMap(); map.put("code", ex.getCode()); map.put("msg", ex.getMsg()); return map; } }
ExceptionController.java
@RestController public class ExceptionController { @RequestMapping("myException") public String myException(){ throw new MyException("1111","This is my Exception!"); } }
瀏覽器訪問:localhost:8080/myException
瀏覽器顯示:{"msg":"This is my Exception!","code":"1111"}
跳轉到一個多帶帶的異常顯示頁面
ControllerAdviceTest.java
@ControllerAdvice public class ControllerAdviceTest { /** * 跳轉視圖顯示異常 * @param ex * @return */ @ExceptionHandler(value = MyException.class) public ModelAndView myErrorHandlerToView(MyException ex) { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("myGlobalExceptionPage"); modelAndView.addObject("code", ex.getCode()); modelAndView.addObject("msg", ex.getMsg()); return modelAndView; } }
myGlobalExceptionPage.html
myGlobalExceptionPage
瀏覽器訪問:localhost:8080/myException
瀏覽器顯示:1111 This is my Exception!
3.綁定值到Model中ControllerAdviceTest.java
@ControllerAdvice public class ControllerAdviceTest { /** * 把值綁定到Model中,使全局@RequestMapping可以獲取到該值 * @param model */ @ModelAttribute public void addAttributes(Model model) { System.out.println("添加全局變量"); model.addAttribute("userName", "Jack"); } }
ExceptionController.java
@RestController public class ExceptionController { /** * 使用注入的ModelMap來取變量 * @param modelMap * @return */ @RequestMapping("modelMapTest1") public Object modelMapTest1(ModelMap modelMap){ Object globalVal = modelMap.get("userName"); System.out.println("全局變量為:"+globalVal); return globalVal; } }
瀏覽器訪問:localhost:8080/modelMapTest1
控制臺輸出:添加全局變量 全局變量為:Jack
瀏覽器顯示:Jack
ExceptionController.java
@RestController public class ExceptionController { /** * 也可以使用@ModelAttribute注解來取變量 * @param globalVal * @return */ @RequestMapping("/modelMapTest2") public Object modelMapTest2(@ModelAttribute("userName") String globalVal) { System.out.println("全局變量為:"+globalVal); return globalVal; } }
瀏覽器訪問:localhost:8080/modelMapTest2
控制臺輸出:添加全局變量 全局變量為:Jack
瀏覽器顯示:Jack
4.轉換日期格式ControllerAdviceTest.java
@ControllerAdvice public class ControllerAdviceTest { /** * 應用到所有@RequestMapping注解方法,在其執行之前初始化數據綁定器 * WebDataBinder是用來綁定請求參數到指定的屬性編輯器 * @param binder */ @InitBinder public void initBinder(WebDataBinder binder) { System.out.println("initBinder執行"); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); dateFormat.setLenient(false); //日期格式是否寬容(只能判斷是否需要跳到下個月去) /* * spring mvc在綁定表單之前,都會先注冊這些編輯器, * Spring自己提供了大量的實現類,諸如CustomDateEditor,CustomBooleanEditor,CustomNumberEditor等 * 使用時候調用WebDataBinder的registerCustomEditor方法注冊 */ binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat,false)); } }
ExceptionController.java
@RestController public class ExceptionController { @RequestMapping("/date") public Date index(Date date){ System.out.println("date="+date); return date; } }
瀏覽器訪問:localhost:8080/date?date=2019-3-20
控制臺輸出:initBinder執行 date=2019-3-20
瀏覽器顯示:"2019-3-20"
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73785.html
摘要:首先,定義一個存放異常處理函數的類,并使用修飾。修飾的方法的寫法和內的異常處理函數寫法是一樣的。控制生效的范圍注意到,我是這樣編寫注解的它用來限定這些異常處理函數起作用的的范圍。使用的機制,做統一異常處理。 在具體的SSM項目開發中,由于Controller層為處于請求處理的最頂層,再往上就是框架代碼的。因此,肯定需要在Controller捕獲所有異常,并且做適當處理,返回給前端一個友...
摘要:一使用實現全局異常處理注解定義全局異常處理類指定自定義錯誤處理方法攔截的異常類型同一個異常被小范圍的異常類和大范圍的異常處理器同時覆蓋,會選擇小范圍的異常處理器定義異常業務類異常年月日定義自定義異常無數據系統異常年月日定義全局異常處理類異常 一、springboot Restful使用@ControllerAdvice、@ExceptionHandler、@ResponseBody實現...
摘要:我們可以寫一個類,在上面注解控制器建言可以有三種建言第一步編寫全局建言類你可以在目錄下編寫一個類我建議放在工具包下如圖很簡單的我們就創建了的增強器第二步編寫功能增強器有三種功能全局異常增強通過的屬性過濾攔截的條件,可以攔截所有的表單初始化增 @ControllerAdvice我們可以寫一個類,在上面注解@ControllerAdvice控制器建言可以有三種建言: 第一步:編寫全局建言類...
摘要:前言如題,今天介紹是如何統一處理全局異常的。主要是用于異常攔截出獲取并將設置到消息類中返回。狀態碼異常攔截類通過加入來聲明該類可攔截請求,同時在方法加入并在該注解中指定要攔截的異常類。測試訪問測試正常返回數據結果。 微信公眾號:一個優秀的廢人如有問題或建議,請后臺留言,我會盡力解決你的問題。 前言 如題,今天介紹 SpringBoot 是如何統一處理全局異常的。SpringBoot 中...
摘要:注解,以明確指出該類是配置的信息源注解會告知掃描指定的包來初始化這能夠確保我們聲明的能夠被發現。注解加載配置文件禁用特定的自動配置注解等價于以默認屬性使用,和。使用這個注釋將警告信息去掉。 @ConditionalOnBean 配置了某個特定Bean@ConditionalOnMissingBean 沒有配置特定的Bean@ConditionalOnClass Classpath里有指...
閱讀 3010·2021-10-08 10:18
閱讀 730·2019-08-30 15:54
閱讀 1062·2019-08-29 18:43
閱讀 2434·2019-08-29 15:33
閱讀 1298·2019-08-29 15:29
閱讀 1599·2019-08-29 13:29
閱讀 1022·2019-08-26 13:46
閱讀 1693·2019-08-26 11:55