摘要:看成提供的一個特殊的攔截器。是一個,用于定義最主要用途,和方法,適用于所有使用方法攔截。為所有封裝統(tǒng)一異常處理代碼。為所有設(shè)置全局變量。用于為所有設(shè)置某個類型的數(shù)據(jù)轉(zhuǎn)換器。
Spring3.2開始提供的新注解,控制器增強(qiáng)(AOP),最主要的應(yīng)用是做統(tǒng)一的異常處理。@ControllerAdvice(看成spring mvc提供的一個特殊的攔截器)。
@ControllerAdvice是一個@Component,用于定義@ExceptionHandler(最主要用途),@InitBinder和@ModelAttribute方法,適用于所有使用@RequestMapping方法(攔截)。
引申:@interface 元注解
@Target(ElementType.TYPE) :該注解應(yīng)用到什么地方。
@Retention(RetentionPolicy.RUNTIME):什么時候應(yīng)用。
@ExceptionHandler:為所有controller封裝統(tǒng)一異常處理代碼。
@ModelAttribute:為所有controller設(shè)置全局變量。
@InitBinder:用于為所有controller設(shè)置某個類型的數(shù)據(jù)轉(zhuǎn)換器。
準(zhǔn)備:搭建好Spring Boot,頁面使用thymeleaf
1.全局異常捕捉處理ControllerAdviceTest.java
/** * 啟動應(yīng)用后,被 @ExceptionHandler、@InitBinder、@ModelAttribute 注解的方法, * 都會作用在 被 @RequestMapping 注解的方法上 */ @ControllerAdvice public class ControllerAdviceTest { /** * 全局異常捕捉處理 * @ExceptionHandler 用來定義函數(shù)針對的異常類型 * @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("服務(wù)器到非洲去了"); } }
瀏覽器訪問:localhost:8080/exception3
瀏覽器顯示:{"msg":"服務(wù)器到非洲去了","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"}
跳轉(zhuǎn)到一個多帶帶的異常顯示頁面
ControllerAdviceTest.java
@ControllerAdvice public class ControllerAdviceTest { /** * 跳轉(zhuǎn)視圖顯示異常 * @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.轉(zhuǎn)換日期格式ControllerAdviceTest.java
@ControllerAdvice public class ControllerAdviceTest { /** * 應(yīng)用到所有@RequestMapping注解方法,在其執(zhí)行之前初始化數(shù)據(jù)綁定器 * WebDataBinder是用來綁定請求參數(shù)到指定的屬性編輯器 * @param binder */ @InitBinder public void initBinder(WebDataBinder binder) { System.out.println("initBinder執(zhí)行"); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); dateFormat.setLenient(false); //日期格式是否寬容(只能判斷是否需要跳到下個月去) /* * spring mvc在綁定表單之前,都會先注冊這些編輯器, * Spring自己提供了大量的實(shí)現(xiàn)類,諸如CustomDateEditor,CustomBooleanEditor,CustomNumberEditor等 * 使用時候調(diào)用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執(zhí)行 date=2019-3-20
瀏覽器顯示:"2019-3-20"
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/73785.html
摘要:首先,定義一個存放異常處理函數(shù)的類,并使用修飾。修飾的方法的寫法和內(nèi)的異常處理函數(shù)寫法是一樣的??刂粕У姆秶⒁獾?,我是這樣編寫注解的它用來限定這些異常處理函數(shù)起作用的的范圍。使用的機(jī)制,做統(tǒng)一異常處理。 在具體的SSM項(xiàng)目開發(fā)中,由于Controller層為處于請求處理的最頂層,再往上就是框架代碼的。因此,肯定需要在Controller捕獲所有異常,并且做適當(dāng)處理,返回給前端一個友...
摘要:一使用實(shí)現(xiàn)全局異常處理注解定義全局異常處理類指定自定義錯誤處理方法攔截的異常類型同一個異常被小范圍的異常類和大范圍的異常處理器同時覆蓋,會選擇小范圍的異常處理器定義異常業(yè)務(wù)類異常年月日定義自定義異常無數(shù)據(jù)系統(tǒng)異常年月日定義全局異常處理類異常 一、springboot Restful使用@ControllerAdvice、@ExceptionHandler、@ResponseBody實(shí)現(xiàn)...
摘要:我們可以寫一個類,在上面注解控制器建言可以有三種建言第一步編寫全局建言類你可以在目錄下編寫一個類我建議放在工具包下如圖很簡單的我們就創(chuàng)建了的增強(qiáng)器第二步編寫功能增強(qiáng)器有三種功能全局異常增強(qiáng)通過的屬性過濾攔截的條件,可以攔截所有的表單初始化增 @ControllerAdvice我們可以寫一個類,在上面注解@ControllerAdvice控制器建言可以有三種建言: 第一步:編寫全局建言類...
摘要:前言如題,今天介紹是如何統(tǒng)一處理全局異常的。主要是用于異常攔截出獲取并將設(shè)置到消息類中返回。狀態(tài)碼異常攔截類通過加入來聲明該類可攔截請求,同時在方法加入并在該注解中指定要攔截的異常類。測試訪問測試正常返回?cái)?shù)據(jù)結(jié)果。 微信公眾號:一個優(yōu)秀的廢人如有問題或建議,請后臺留言,我會盡力解決你的問題。 前言 如題,今天介紹 SpringBoot 是如何統(tǒng)一處理全局異常的。SpringBoot 中...
摘要:注解,以明確指出該類是配置的信息源注解會告知掃描指定的包來初始化這能夠確保我們聲明的能夠被發(fā)現(xiàn)。注解加載配置文件禁用特定的自動配置注解等價于以默認(rèn)屬性使用,和。使用這個注釋將警告信息去掉。 @ConditionalOnBean 配置了某個特定Bean@ConditionalOnMissingBean 沒有配置特定的Bean@ConditionalOnClass Classpath里有指...
閱讀 3024·2021-10-08 10:18
閱讀 742·2019-08-30 15:54
閱讀 1072·2019-08-29 18:43
閱讀 2449·2019-08-29 15:33
閱讀 1311·2019-08-29 15:29
閱讀 1611·2019-08-29 13:29
閱讀 1031·2019-08-26 13:46
閱讀 1708·2019-08-26 11:55