欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

spring中@ControllerAdvice 注解的使用

 更新時(shí)間:2024年09月13日 09:54:27   作者:快樂(lè)的小三菊  
@ControllerAdvice注解是Spring3.2中新增的注解,主要用于Controller的全局配置,本文就來(lái)介紹一下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循環(huán)依賴的原理

    一文搞懂Spring循環(huán)依賴的原理

    這篇文章將用實(shí)例來(lái)為大家詳細(xì)介紹@Autowired解決循環(huán)依賴的原理,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Spring有一定幫助,感興趣的可以學(xué)習(xí)一下
    2022-07-07
  • 深入淺出JAVA MyBatis-快速入門

    深入淺出JAVA MyBatis-快速入門

    這篇文章主要介紹了在今天這篇博文中,我將要介紹一下mybatis的框架原理,以及mybatis的入門程序,實(shí)現(xiàn)用戶的增刪改查,她有什么優(yōu)缺點(diǎn)以及mybatis和hibernate之間存在著怎么樣的關(guān)系,大家這些問(wèn)題一起通過(guò)本文學(xué)習(xí)吧
    2021-06-06
  • 詳解Spring MVC自動(dòng)為對(duì)象注入枚舉類型

    詳解Spring MVC自動(dòng)為對(duì)象注入枚舉類型

    本篇文章主要介紹了Spring MVC自動(dòng)為對(duì)象注入枚舉類型,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • SpringBoot實(shí)現(xiàn)配置文件自動(dòng)加載和刷新的示例詳解

    SpringBoot實(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ù)綁定與數(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
  • Windows下如何安裝配置Redis環(huán)境

    Windows下如何安裝配置Redis環(huán)境

    這篇文章主要介紹了Windows下如何安裝配置Redis環(huán)境,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 詳解Java如何進(jìn)行Base64的編碼(Encode)與解碼(Decode)

    詳解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-03
  • java中不同版本JSONObject區(qū)別小結(jié)

    java中不同版本JSONObject區(qū)別小結(jié)

    本文主要介紹了java中不同版本JSONObject區(qū)別小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • Springboot注解@Value讀取配置文件參數(shù)詳解

    Springboot注解@Value讀取配置文件參數(shù)詳解

    Spring Boot提供了靈活的配置文件讀取機(jī)制,主要有兩種方式,第一種是使用@Value注解直接在類屬性上讀取application.yml文件中的配置,這種方式簡(jiǎn)單直接,但需要為每個(gè)配置項(xiàng)單獨(dú)設(shè)置屬性,第二種方式是通過(guò)@PropertySource注解讀取自定義的Properties文件
    2024-11-11
  • Java中&和&&的區(qū)別簡(jiǎn)單介紹

    Java中&和&&的區(qū)別簡(jiǎn)單介紹

    這篇文章主要介紹了Java中&和&&的區(qū)別,&&邏輯與||邏輯或  它們都是邏輯運(yùn)算符,& 按位與|按位或它們都是位運(yùn)算符,更多詳細(xì)內(nèi)容請(qǐng)需要的小伙伴了解下面文章內(nèi)容
    2022-01-01

最新評(píng)論