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

Spring中@ControllerAdvice注解的用法解析

 更新時(shí)間:2023年10月12日 11:38:43   作者:探索er  
這篇文章主要介紹了Spring中@ControllerAdvice注解的用法解析,顧名思義,@ControllerAdvice就是@Controller 的增強(qiáng)版,@ControllerAdvice主要用來(lái)處理全局?jǐn)?shù)據(jù),一般搭配@ExceptionHandler、@ModelAttribute以及@InitBinder使用,需要的朋友可以參考下

@ControllerAdvice 用法

顧名思義,@ControllerAdvice就是@Controller 的增強(qiáng)版。

@ControllerAdvice主要用來(lái)處理全局?jǐn)?shù)據(jù),一般搭配@ExceptionHandler、@ModelAttribute以及@InitBinder使用。

全局異常處理

@ControllerAdvice最常見(jiàn)的使用場(chǎng)景就是全局異常處理。

比如文件上傳大小限制的配置,如果用戶(hù)上傳的文件超過(guò)了限制大小,就會(huì)拋出異常,此時(shí)可以通過(guò)@ControllerAdvice結(jié)合@ExceptionHandler定義全局異常捕獲機(jī)制,代碼如下:

@ControllerAdvice
public class CustomExceptionHandler {
    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public void uploadException(MaxUploadSizeExceededException e, HttpServletResponse resp) throws IOException {
        resp.setContentType("text/html;charset=utf-8");
        System.out.println(1111);
        PrintWriter out = resp.getWriter();
        out.write("上傳文件大小超出限制!");
        out.flush();
        out.close();
    }
}

只需在系統(tǒng)中定義CustomExceptionHandler類(lèi),然后添加@ControllerAdvice注解即可。當(dāng)系統(tǒng)啟動(dòng)時(shí),該類(lèi)就會(huì)被掃描到Spring容器中,然后定義uploadException方法,在該方法上添加了@ExceptionHandler注解,其中定義的MaxUploadSizeExceededException.class 表明該方法用來(lái)處理MaxUploadSizeExceededException類(lèi)型的異常。如果想讓該方法處理所有類(lèi)型的異常,只需將MaxUploadSizeExceededException改為 Exception即可。方法的參數(shù)可以有異常實(shí)例、HttpServletResponse以及HttpServletRequest、Model 等,返回值可以是一段JSON、一個(gè)ModelAndView、一個(gè)邏輯視圖名等。此時(shí),上傳一個(gè)超大文件會(huì)有錯(cuò)誤提示給用戶(hù)。

在這里插入圖片描述

如果返回參數(shù)是一個(gè)ModelAndView,假設(shè)使用的頁(yè)面模板為T(mén)hymeleaf(注意添加Thymeleaf相關(guān)依賴(lài)),此時(shí)異常處理方法定義如下:

@ControllerAdvice
public class CustomExceptionHandler {
    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public ModelAndView uploadException(MaxUploadSizeExceededException e) throws IOException {
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg", "上傳文件大小超出限制! ");
        mv.setViewName("error");
        return mv;
    }
}

然后在resources/templates目錄下創(chuàng)建error.html文件,內(nèi)容如下:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title></head>
<body>
<div th:text="${msg}"></div>
</body>
</html>

此時(shí)上傳出錯(cuò)效果一致。

添加全局?jǐn)?shù)據(jù)

@ControllerAdvice是一個(gè)全局?jǐn)?shù)據(jù)處理組件,因此也可以在@ControllerAdvice中配置全局?jǐn)?shù)據(jù),使用@ModelAttribute注解進(jìn)行配置,代碼如下:

@ControllerAdvice
public class GlobalConfig {
    @ModelAttribute(value = "info")
    public Map<String, String> userInfo() {
        HashMap<String, String> map = new HashMap<>();
        map.put("username", "羅貫中");
        map.put("gender", "男");
        return map;
    }
}

代碼解釋:

  • 在全局配置中添加userInfo方法,返回一個(gè)map。該方法有一個(gè)注解@ModelAttribute,其中的value屬性表示這條返回?cái)?shù)據(jù)的key,而方法的返回值是返回?cái)?shù)據(jù)的value。
  • 此時(shí)在任意請(qǐng)求的Controller 中,通過(guò)方法參數(shù)中的Model都可以獲取info 的數(shù)據(jù)。

Controller 例代碼如下:

public class MyController {
    @GetMapping("/hello")
    @ResponseBody
    public void hello(Model model) {
        Map<String, Object> map = model.asMap();
        Set<String> keySet = map.keySet();
        Iterator<String> iterator = keySet.iterator();
        while (iterator.hasNext()) {
            String key = iterator.next();
            Object value = map.get(key);
            System.out.println(key + ">>>>>" + value);
        }
    }
}

在請(qǐng)求方法中,將Model 中的數(shù)據(jù)打印出來(lái),如圖所示。

在這里插入圖片描述

請(qǐng)求參數(shù)預(yù)處理

@ControllerAdvice結(jié)合@InitBinder還能實(shí)現(xiàn)請(qǐng)求參數(shù)預(yù)處理,即將表單中的數(shù)據(jù)綁定到實(shí)體類(lèi)上時(shí)進(jìn)行一些額外處理。

例如有兩個(gè)實(shí)體類(lèi) Book和 Author,代碼如下:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@ToString
public class Book {
    private String name;
    private String author;
    @JsonIgnore//一般標(biāo)記在屬性或者方法上,返回的json數(shù)據(jù)即不包含該屬性
    private Float price;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date publicationDate;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Author {
    private String name;
    private int age;
}

在 Controller 上需要接收兩個(gè)實(shí)體類(lèi)的數(shù)據(jù),Controller 中的方法定義如下:

@ControllerAdvice
public class GlobalConfig1 {
    @InitBinder("b")
    public void init(WebDataBinder binder) {
        binder.setFieldDefaultPrefix("b.");
    }
    @InitBinder("a")
    public void init2(WebDataBinder binder) {
        binder.setFieldDefaultPrefix("a.");
    }
}

代碼解釋:

  • 在 GlobalConfig類(lèi)中創(chuàng)建兩個(gè)方法,第一個(gè)@InitBinder(“b”)表示該方法是處理@ModelAttribute(“b”)對(duì)應(yīng)的參數(shù)的,第二個(gè)@InitBinder(“a”)表示該方法是處理@ModelAttribute(“a”)對(duì)應(yīng)的參數(shù)的。
  • 在每個(gè)方法中給相應(yīng)的 Field設(shè)置一個(gè)前綴,然后在瀏覽器中請(qǐng)求http:/ocalhost:8080/book?b.name=三國(guó)演義&b.author=羅貫中&a.name=曹雪芹&a.age=48,即可成功地區(qū)分出name屬性。
  • 在WebDataBinder對(duì)象中,還可以設(shè)置允許的字段、禁止的字段、必填字段以及驗(yàn)證器等。

ld設(shè)置一個(gè)前綴,然后在瀏覽器中請(qǐng)求/ocalhost:8080/book?b.name=三國(guó)演義&b.author=羅貫中&a.name=曹雪芹&a.age=48,即可成功地區(qū)分出name屬性。

在WebDataBinder對(duì)象中,還可以設(shè)置允許的字段、禁止的字段、必填字段以及驗(yàn)證器等。

在這里插入圖片描述

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

相關(guān)文章

  • SpringBoot中Druid連接池與多數(shù)據(jù)源切換的方法

    SpringBoot中Druid連接池與多數(shù)據(jù)源切換的方法

    微服務(wù)架構(gòu)中多數(shù)據(jù)源切換是個(gè)常見(jiàn)的需求,Spring Boot 提供了強(qiáng)大的支持來(lái)簡(jiǎn)化這一過(guò)程.本文給大家介紹了SpringBoot中Druid連接池與多數(shù)據(jù)源切換的方法,需要的朋友可以參考下
    2024-11-11
  • Java Exception 捕獲和顯示實(shí)例詳解

    Java Exception 捕獲和顯示實(shí)例詳解

    這篇文章主要介紹了Java Exception 捕獲和顯示實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • java數(shù)組算法例題代碼詳解(冒泡排序,選擇排序,找最大值、最小值,添加、刪除元素等)

    java數(shù)組算法例題代碼詳解(冒泡排序,選擇排序,找最大值、最小值,添加、刪除元素等)

    這篇文章主要介紹了java數(shù)組算法例題代碼詳解(冒泡排序,選擇排序,找最大值、最小值,添加、刪除元素等),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-05-05
  • Spring Cloud Gateway入門(mén)解讀

    Spring Cloud Gateway入門(mén)解讀

    本篇文章主要介紹了Spring Cloud Gateway入門(mén)解讀,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Java基于LoadingCache實(shí)現(xiàn)本地緩存的示例代碼

    Java基于LoadingCache實(shí)現(xiàn)本地緩存的示例代碼

    本文主要介紹了Java基于LoadingCache實(shí)現(xiàn)本地緩存的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 用java實(shí)現(xiàn)在txt文本中寫(xiě)數(shù)據(jù)和讀數(shù)據(jù)的方法

    用java實(shí)現(xiàn)在txt文本中寫(xiě)數(shù)據(jù)和讀數(shù)據(jù)的方法

    今天小編就為大家分享一篇用java實(shí)現(xiàn)在txt文本中寫(xiě)數(shù)據(jù)和讀數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • Java匿名對(duì)象與匿名內(nèi)部類(lèi)

    Java匿名對(duì)象與匿名內(nèi)部類(lèi)

    本篇文章給大家詳細(xì)講解了Java匿名對(duì)象與匿名內(nèi)部類(lèi)的相關(guān)知識(shí)點(diǎn),有興趣的讀者一起學(xué)習(xí)下。
    2018-03-03
  • SpringBoot2整合Drools規(guī)則引擎及案例詳解

    SpringBoot2整合Drools規(guī)則引擎及案例詳解

    這篇文章主要介紹了SpringBoot2整合Drools規(guī)則引擎及案例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Redis中的事務(wù)和Redis樂(lè)觀(guān)鎖詳解

    Redis中的事務(wù)和Redis樂(lè)觀(guān)鎖詳解

    這篇文章主要介紹了Redis中的事務(wù)和Redis樂(lè)觀(guān)鎖詳解,Redis事務(wù)是一個(gè)單獨(dú)的隔離操作:事務(wù)中的所有命令都會(huì)序列化、按順序地執(zhí)行,事務(wù)在執(zhí)行的過(guò)程中,不會(huì)被其他客戶(hù)端發(fā)送來(lái)的命令請(qǐng)求所打斷,需要的朋友可以參考下
    2023-12-12
  • Java項(xiàng)目有中多個(gè)線(xiàn)程如何查找死鎖

    Java項(xiàng)目有中多個(gè)線(xiàn)程如何查找死鎖

    這篇文章主要介紹了Java項(xiàng)目有中多個(gè)線(xiàn)程如何查找死鎖,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05

最新評(píng)論

奎屯市| 保靖县| 九寨沟县| 义乌市| 石家庄市| 温泉县| 栾川县| 仪陇县| 牡丹江市| 万荣县| 米易县| 嫩江县| 宁远县| 利津县| 罗平县| 祁东县| 突泉县| 获嘉县| 怀远县| 精河县| 当涂县| 宁阳县| 阿克陶县| 德令哈市| 太仆寺旗| 大渡口区| 沂源县| 姜堰市| 类乌齐县| 台中县| 寻乌县| 盐津县| 历史| 万安县| 招远市| 郴州市| 米泉市| 石屏县| 金阳县| 扎囊县| 唐海县|