最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring中@ControllerAdvice 注解的使用

 更新時(shí)間:2024年09月13日 09:54:27   作者:快樂的小三菊  
@ControllerAdvice注解是Spring3.2中新增的注解,主要用于Controller的全局配置,本文就來介紹一下spring中@ControllerAdvice 注解的使用,感興趣的可以了解一下

一、簡介

@ControllerAdvice 注解是 spring3.2 中新增的注解,學(xué)名是 Controller 增強(qiáng)器,主要是為了給 Controller 控制器添加統(tǒng)一的操作或處理。

@ControllerAdvice 注解是在類上面聲明的注解。

二、作用

1、搭配 @ExceptionHandler 一起使用,可以做到全局異常處理。

2、搭配 @ModelAttribute 一起使用,可以做到添加全局?jǐn)?shù)據(jù),在方法執(zhí)行前進(jìn)行一些操作。

3、搭配 @InitBinder 一起使用,可以做到請求參數(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)用下面的測試方法,代碼如下,當(dāng)訪問 /users 的時(shí)候,因?yàn)樵谠摲椒ㄖ袙伋隽?nbsp;RuntimeException,這里的異常捕獲器就會捕獲該異常,然后返回我們定義的異常視圖(默認(rèn)的error 視圖)。 

@Controller
public class UserController {
    @RequestMapping(value = "/users", method = RequestMethod.GET)
    public void users() {
        throw new RuntimeException("沒有任何用戶。");
    }
}

四、搭配 @InitBinder 使用

對于 @InitBinder,該注解的主要作用是綁定一些自定義的參數(shù)。如下代碼:

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface InitBinder {

    // 這里value參數(shù)用于指定需要綁定的參數(shù)名稱,如果不指定,則會對所有的參數(shù)進(jìn)行適配,
    // 只有是其指定的類型的參數(shù)才會被轉(zhuǎn)換
    String[] value() default {};
}

一般情況下我們使用的參數(shù)通過 @RequestParam,@RequestBody 或者 @ModelAttribute等注解就可以進(jìn)行綁定了。但對于一些特殊類型參數(shù),比如 Date,它們的綁定 Spring 是沒有提供直接的支持的。我們只能為其聲明一個(gè)轉(zhuǎn)換器,將 request 中字符串類型的參數(shù)通過轉(zhuǎn)換器轉(zhuǎn)換為 Date 類型的參數(shù),從而供給 @RequestMapping 標(biāo)注的方法使用。

如下代碼,使用 @InitBinder 注冊 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)注的方法注冊的 Formatter 在每次 request 請求進(jìn)行參數(shù)轉(zhuǎn)換時(shí)都會調(diào)用,用于判斷指定的參數(shù)是否為其可以轉(zhuǎn)換的參數(shù)??梢钥吹疆?dāng)訪問 /users 的時(shí)候,對 request 參數(shù)進(jìn)行了轉(zhuǎn)換,并且在接口方法中成功接收了該參數(shù),并在控制臺打印出日期格式的結(jié)果。

五、搭配 @ModelAttribute 使用

關(guān)于 @ModelAttribute 的用法,除了用于方法參數(shù)時(shí)可以用于轉(zhuǎn)換對象類型的屬性之外,其還可以用來進(jìn)行方法的聲明。如果聲明在方法上,并且結(jié)合 @ControllerAdvice,該方法將會在 @ControllerAdvice 所指定的范圍內(nèi)的所有接口方法執(zhí)行之前執(zhí)行,并且 @ModelAttribute 標(biāo)注的方法的返回值還可以供給后續(xù)會調(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屬性指定名稱的屬性將不會被處理
    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全局屬性。";
    }
}

測試代碼如下:

@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í)行之后才會執(zhí)行。

參考博客地址:https://www.cnblogs.com/hdfu/p/17699137.html

到此這篇關(guān)于spring中@ControllerAdvice 注解的使用的文章就介紹到這了,更多相關(guān)spring @ControllerAdvice 注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java?Ribbon與openfeign區(qū)別和用法講解

    Java?Ribbon與openfeign區(qū)別和用法講解

    Ribbon是基于Netflix?Ribbon實(shí)現(xiàn)的一套客戶端負(fù)載均衡的工具,主要功能是提供客戶端的軟件負(fù)載均衡算法和服務(wù)調(diào)用。openfeign對Feign進(jìn)行了增強(qiáng),使其支持Spring MVC注解,另外還整合了Ribbon和Nacos,從而使得Feign的使用更加方便
    2022-08-08
  • SpringBoot框架底層原理解析

    SpringBoot框架底層原理解析

    這篇文章主要介紹了SpringBoot底層原理,包括配置優(yōu)先級的配置方式給大家講解的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • Springboot中的異步任務(wù)執(zhí)行及監(jiān)控詳解

    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ù),以及對異步任務(wù)進(jìn)行封裝監(jiān)控,需要的朋友可以參考下
    2023-10-10
  • Java后端面試高頻題整理(面試版答案)

    Java后端面試高頻題整理(面試版答案)

    后端Java開發(fā)是現(xiàn)代軟件工程的重要組成部分,對于應(yīng)聘后端Java開發(fā)崗位的求職者來說,筆試是一項(xiàng)常見的考核方式,這篇文章主要介紹了Java后端面試高頻題整理的相關(guān)資料,需要的朋友可以參考下
    2026-05-05
  • 基于SpringMVC的全局異常處理器介紹

    基于SpringMVC的全局異常處理器介紹

    下面小編就為大家?guī)硪黄赟pringMVC的全局異常處理器介紹。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • Java基礎(chǔ)之方法重寫詳解

    Java基礎(chǔ)之方法重寫詳解

    這篇文章主要介紹了Java基礎(chǔ)之方法重寫詳解,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • javaweb中靜態(tài)文件的常用處理方法匯總

    javaweb中靜態(tài)文件的常用處理方法匯總

    這篇文章主要介紹了javaweb中靜態(tài)文件的常用處理方法匯總,非常實(shí)用的技巧,需要的朋友可以參考下
    2014-08-08
  • SpringBoot和VUE源碼直接整合打包成jar的踩坑記錄

    SpringBoot和VUE源碼直接整合打包成jar的踩坑記錄

    這篇文章主要介紹了SpringBoot和VUE源碼直接整合打包成jar的踩坑記錄,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 關(guān)于Springboot2.x集成lettuce連接redis集群報(bào)超時(shí)異常Command timed out after 6 second(s)

    關(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)用案例

    這篇文章主要為大家介紹了java?list和map切割分段的實(shí)現(xiàn)及多線程應(yīng)用案例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12

最新評論

关岭| 岳阳市| 枣强县| 华安县| 集贤县| 光泽县| 翁牛特旗| 瑞丽市| 论坛| 屏东市| 河间市| 湖口县| 霍林郭勒市| 华亭县| 陈巴尔虎旗| 甘南县| 正镶白旗| 临沂市| 齐河县| 肥乡县| 福安市| 澄迈县| 荆门市| 左云县| 甘孜| 金华市| 新兴县| 霸州市| 苗栗县| 宣武区| 两当县| 玛多县| 北票市| 大渡口区| 达拉特旗| 顺平县| 扶余县| 乌鲁木齐市| 罗山县| 塘沽区| 浙江省|