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)訪問 /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("沒有任何用戶。");
}
}四、搭配 @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ù)通過 @RequestParam,@RequestBody 或者 @ModelAttribute等注解就可以進(jìn)行綁定了。但對(duì)于一些特殊類型參數(shù),比如 Date,它們的綁定 Spring 是沒有提供直接的支持的。我們只能為其聲明一個(gè)轉(zhuǎn)換器,將 request 中字符串類型的參數(shù)通過轉(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)訪問 /users 的時(shí)候,對(duì) request 參數(shù)進(jìn)行了轉(zhuǎn)換,并且在接口方法中成功接收了該參數(shù),并在控制臺(tái)打印出日期格式的結(jié)果。
五、搭配 @ModelAttribute 使用
關(guān)于 @ModelAttribute 的用法,除了用于方法參數(shù)時(shí)可以用于轉(zhuǎn)換對(duì)象類型的屬性之外,其還可以用來進(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 層就可以通過 @ModelAttribute 注解接收名稱為 message 的參數(shù),從而獲取到前面綁定的參數(shù)了。
需要說明的是,@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)文章
Java?Ribbon與openfeign區(qū)別和用法講解
Ribbon是基于Netflix?Ribbon實(shí)現(xiàn)的一套客戶端負(fù)載均衡的工具,主要功能是提供客戶端的軟件負(fù)載均衡算法和服務(wù)調(diào)用。openfeign對(duì)Feign進(jìn)行了增強(qiáng),使其支持Spring MVC注解,另外還整合了Ribbon和Nacos,從而使得Feign的使用更加方便2022-08-08
Springboot中的異步任務(wù)執(zhí)行及監(jiān)控詳解
這篇文章主要介紹了Springboot中的異步任務(wù)執(zhí)行及監(jiān)控詳解,除了自己實(shí)現(xiàn)線程外,springboot本身就提供了通過注解的方式,進(jìn)行異步任務(wù)的執(zhí)行,下面主要記錄一下,在Springboot項(xiàng)目中實(shí)現(xiàn)異步任務(wù),以及對(duì)異步任務(wù)進(jìn)行封裝監(jiān)控,需要的朋友可以參考下2023-10-10
SpringBoot和VUE源碼直接整合打包成jar的踩坑記錄
這篇文章主要介紹了SpringBoot和VUE源碼直接整合打包成jar的踩坑記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
關(guān)于Springboot2.x集成lettuce連接redis集群報(bào)超時(shí)異常Command timed out afte
這篇文章主要介紹了Springboot2.x集成lettuce連接redis集群報(bào)超時(shí)異常Command timed out after 6 second(s),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-03-03
java?list和map切割分段的實(shí)現(xiàn)及多線程應(yīng)用案例
這篇文章主要為大家介紹了java?list和map切割分段的實(shí)現(xiàn)及多線程應(yīng)用案例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12

