spring中@ControllerAdvice 注解的使用
一、簡(jiǎn)介
@ControllerAdvice 注解是 spring3.2 中新增的注解,學(xué)名是 Controller 增強(qiáng)器,主要是為了給 Controller 控制器添加統(tǒng)一的操作或處理。
@ControllerAdvice 注解是在類上面聲明的注解。
二、作用
1、搭配 @ExceptionHandler 一起使用,可以做到全局異常處理。
2、搭配 @ModelAttribute 一起使用,可以做到添加全局?jǐn)?shù)據(jù),在方法執(zhí)行前進(jìn)行一些操作。
3、搭配 @InitBinder 一起使用,可以做到請(qǐng)求參數(shù)預(yù)處理,即綁定一些自定義參數(shù)。
三、搭配 @ExceptionHandler 使用
我們可以使用 @ExceptionHandler 捕獲 RuntimeException 異常,代碼如下:
@ControllerAdvice public class SpringControllerAdvice { @ExceptionHandler(RuntimeException.class) public ModelAndView runtimeExceptionHandler(RuntimeException e) { e.printStackTrace(); return new ModelAndView("error"); } }
我們還可以使用 @ExceptionHandler 捕獲自定義異常,代碼如下:
public class CustomException extends RuntimeException { private AppHttpCodeEnum appHttpCodeEnum; public CustomException(AppHttpCodeEnum appHttpCodeEnum){ this.appHttpCodeEnum = appHttpCodeEnum; } public AppHttpCodeEnum getAppHttpCodeEnum() { return appHttpCodeEnum; } }
@ControllerAdvice @Slf4j public class ExceptionCatch { @ExceptionHandler(CustomException.class) @ResponseBody public ResponseResult exception(CustomException e){ log.error("catch exception:{}",e); return ResponseResult.errorResult(e.getAppHttpCodeEnum()); } }
我們還可以使用 @ExceptionHandler 捕獲不可控的全局異常,代碼如下:
@ControllerAdvice @Slf4j public class ExceptionCatch { @ExceptionHandler(Exception.class) @ResponseBody public ResponseResult exception(Exception e){ e.printStackTrace(); log.error("catch exception:{}",e.getMessage()); return ResponseResult.errorResult(AppHttpCodeEnum.SERVER_ERROR); } }
調(diào)用下面的測(cè)試方法,代碼如下,當(dāng)訪問(wèn) /users 的時(shí)候,因?yàn)樵谠摲椒ㄖ袙伋隽?nbsp;RuntimeException,這里的異常捕獲器就會(huì)捕獲該異常,然后返回我們定義的異常視圖(默認(rèn)的error 視圖)。
@Controller public class UserController { @RequestMapping(value = "/users", method = RequestMethod.GET) public void users() { throw new RuntimeException("沒(méi)有任何用戶。"); } }
四、搭配 @InitBinder 使用
對(duì)于 @InitBinder,該注解的主要作用是綁定一些自定義的參數(shù)。如下代碼:
@Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface InitBinder { // 這里value參數(shù)用于指定需要綁定的參數(shù)名稱,如果不指定,則會(huì)對(duì)所有的參數(shù)進(jìn)行適配, // 只有是其指定的類型的參數(shù)才會(huì)被轉(zhuǎn)換 String[] value() default {}; }
一般情況下我們使用的參數(shù)通過(guò) @RequestParam,@RequestBody 或者 @ModelAttribute等注解就可以進(jìn)行綁定了。但對(duì)于一些特殊類型參數(shù),比如 Date,它們的綁定 Spring 是沒(méi)有提供直接的支持的。我們只能為其聲明一個(gè)轉(zhuǎn)換器,將 request 中字符串類型的參數(shù)通過(guò)轉(zhuǎn)換器轉(zhuǎn)換為 Date 類型的參數(shù),從而供給 @RequestMapping 標(biāo)注的方法使用。
如下代碼,使用 @InitBinder 注冊(cè) Date 類型參數(shù)轉(zhuǎn)換器的實(shí)現(xiàn):
@ControllerAdvice public class SpringControllerAdvice { @InitBinder public void globalInitBinder(WebDataBinder binder) { binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd")); } }
這里 @InitBinder 標(biāo)注的方法注冊(cè)的 Formatter 在每次 request 請(qǐng)求進(jìn)行參數(shù)轉(zhuǎn)換時(shí)都會(huì)調(diào)用,用于判斷指定的參數(shù)是否為其可以轉(zhuǎn)換的參數(shù)??梢钥吹疆?dāng)訪問(wèn) /users 的時(shí)候,對(duì) request 參數(shù)進(jìn)行了轉(zhuǎn)換,并且在接口方法中成功接收了該參數(shù),并在控制臺(tái)打印出日期格式的結(jié)果。
五、搭配 @ModelAttribute 使用
關(guān)于 @ModelAttribute 的用法,除了用于方法參數(shù)時(shí)可以用于轉(zhuǎn)換對(duì)象類型的屬性之外,其還可以用來(lái)進(jìn)行方法的聲明。如果聲明在方法上,并且結(jié)合 @ControllerAdvice,該方法將會(huì)在 @ControllerAdvice 所指定的范圍內(nèi)的所有接口方法執(zhí)行之前執(zhí)行,并且 @ModelAttribute 標(biāo)注的方法的返回值還可以供給后續(xù)會(huì)調(diào)用的接口方法使用。
該注解的定義方法如下所示:
@Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ModelAttribute { // 該屬性與name屬性的作用一致,用于指定目標(biāo)參數(shù)的名稱 @AliasFor("name") String value() default ""; @AliasFor("value") String name() default ""; // 與name屬性一起使用,如果指定了binding為false,那么name屬性指定名稱的屬性將不會(huì)被處理 boolean binding() default true; }
這里 @ModelAttribute 的各個(gè)屬性值主要是用于其在接口方法參數(shù)上進(jìn)行標(biāo)注時(shí)使用的,如果是作為方法注解,其 name 或 value 屬性則指定的是返回值的名稱。如下面的例子:
@ControllerAdvice public class SpringControllerAdvice { @ModelAttribute(value = "message") public String globalModelAttribute() { System.out.println("添加了message全局屬性。"); return "輸出了message全局屬性。"; } }
測(cè)試代碼如下:
@Controller public class UserController { @RequestMapping(value = "/users", method = RequestMethod.GET) public void users(@ModelAttribute("message") String message) { System.out.println(message); } }
這里 @ModelAttribute 注解的方法提供了一個(gè) String 類型的返回值,而 @ModelAttribute 注解中指定了該屬性的名稱是 message,這樣在 Controller 層就可以通過(guò) @ModelAttribute 注解接收名稱為 message 的參數(shù),從而獲取到前面綁定的參數(shù)了。
需要說(shuō)明的是,@ModelAttribute 標(biāo)注的方法的執(zhí)行是在所有的攔截器的 preHandle() 方法執(zhí)行之后才會(huì)執(zhí)行。
參考博客地址:https://www.cnblogs.com/hdfu/p/17699137.html
到此這篇關(guān)于spring中@ControllerAdvice 注解的使用的文章就介紹到這了,更多相關(guān)spring @ControllerAdvice 注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Spring MVC自動(dòng)為對(duì)象注入枚舉類型
本篇文章主要介紹了Spring MVC自動(dòng)為對(duì)象注入枚舉類型,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04SpringBoot實(shí)現(xiàn)配置文件自動(dòng)加載和刷新的示例詳解
在使用Spring Boot開(kāi)發(fā)應(yīng)用程序時(shí),配置文件是非常重要的組成部分,在不同的環(huán)境中,我們可能需要使用不同的配置文件,當(dāng)我們更改配置文件時(shí),我們希望應(yīng)用程序能夠自動(dòng)加載和刷新配置文件,本文我們將探討Spring Boot如何實(shí)現(xiàn)配置文件的自動(dòng)加載和刷新2023-08-08深入理解SpringMVC的參數(shù)綁定與數(shù)據(jù)響應(yīng)機(jī)制
本文將深入探討SpringMVC的參數(shù)綁定方式,包括基本類型、對(duì)象、集合等類型的綁定方式,以及如何處理參數(shù)校驗(yàn)和異常。同時(shí),本文還將介紹SpringMVC的數(shù)據(jù)響應(yīng)機(jī)制,包括如何返回JSON、XML等格式的數(shù)據(jù),以及如何處理文件上傳和下載。2023-06-06詳解Java如何進(jìn)行Base64的編碼(Encode)與解碼(Decode)
這篇文章主要介紹了詳解Java如何進(jìn)行Base64的編碼(Encode)與解碼(Decode),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03java中不同版本JSONObject區(qū)別小結(jié)
本文主要介紹了java中不同版本JSONObject區(qū)別小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02Springboot注解@Value讀取配置文件參數(shù)詳解
Spring Boot提供了靈活的配置文件讀取機(jī)制,主要有兩種方式,第一種是使用@Value注解直接在類屬性上讀取application.yml文件中的配置,這種方式簡(jiǎn)單直接,但需要為每個(gè)配置項(xiàng)單獨(dú)設(shè)置屬性,第二種方式是通過(guò)@PropertySource注解讀取自定義的Properties文件2024-11-11