亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

@ControllerAdvice 用法解析

 更新時間:2022年11月29日 11:25:17   作者:探索er  
@ControllerAdvice就是@Controller 的增強版,@ControllerAdvice主要用來處理全局數(shù)據(jù),一般搭配@ExceptionHandler、@ModelAttribute以及@InitBinder使用,這篇文章主要介紹了@ControllerAdvice 用法,需要的朋友可以參考下

@ControllerAdvice 用法

顧名思義,@ControllerAdvice就是@Controller 的增強版。@ControllerAdvice主要用來處理全局數(shù)據(jù),一般搭配@ExceptionHandler、@ModelAttribute以及@InitBinder使用。

全局異常處理

@ControllerAdvice最常見的使用場景就是全局異常處理。比如文件上傳大小限制的配置,如果用戶上傳的文件超過了限制大小,就會拋出異常,此時可以通過@ControllerAdvice結(jié)合@ExceptionHandler定義全局異常捕獲機制,代碼如下:

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

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

@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ù)據(jù)

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

@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方法,返回一個map。該方法有一個注解@ModelAttribute,其中的value屬性表示這條返回數(shù)據(jù)的key,而方法的返回值是返回數(shù)據(jù)的value。
  • 此時在任意請求的Controller 中,通過方法參數(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);
        }
    }
}

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

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

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

例如有兩個實體類 Book和 Author,代碼如下:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@ToString
public class Book {
    private String name;
    private String author;
    @JsonIgnore//一般標記在屬性或者方法上,返回的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 上需要接收兩個實體類的數(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類中創(chuàng)建兩個方法,第一個@InitBinder(“b”)表示該方法是處理@ModelAttribute(“b”)對應(yīng)的參數(shù)的,第二個@InitBinder(“a”)表示該方法是處理@ModelAttribute(“a”)對應(yīng)的參數(shù)的。
  • 在每個方法中給相應(yīng)的 Field設(shè)置一個前綴,然后在瀏覽器中請求http:/ocalhost:8080/book?b.name=三國演義&b.author=羅貫中&a.name=曹雪芹&a.age=48,即可成功地區(qū)分出name屬性。
  • 在WebDataBinder對象中,還可以設(shè)置允許的字段、禁止的字段、必填字段以及驗證器等。

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

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

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

相關(guān)文章

  • java.net.MalformedURLException異常的解決方法

    java.net.MalformedURLException異常的解決方法

    下面小編就為大家?guī)硪黄猨ava.net.MalformedURLException異常的解決方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • SpringBoot集成Apache POI實現(xiàn)Excel的導(dǎo)入導(dǎo)出

    SpringBoot集成Apache POI實現(xiàn)Excel的導(dǎo)入導(dǎo)出

    Apache POI是一個流行的Java庫,用于處理Microsoft Office格式文件,包括Excel文件,本文主要介紹了SpringBoot集成Apache POI實現(xiàn)Excel的導(dǎo)入導(dǎo)出,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • Java中實現(xiàn) SHA-256加密的兩種方式

    Java中實現(xiàn) SHA-256加密的兩種方式

    這篇文章主要介紹了Java中實現(xiàn) SHA-256加密的兩種方式,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-01-01
  • 一文帶你了解SpringBoot中常用注解的原理和使用

    一文帶你了解SpringBoot中常用注解的原理和使用

    這篇文章主要介紹了一文帶你了解SpringBoot中常用注解的原理和使用
    2022-11-11
  • Spring Boot 自定義 Shiro 過濾器無法使用 @Autowired問題及解決方法

    Spring Boot 自定義 Shiro 過濾器無法使用 @Autowired問題及解決方法

    這篇文章主要介紹了Spring Boot 自定義 Shiro 過濾器無法使用 @Autowired問題及解決方法 ,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-06-06
  • Netty學(xué)習(xí)教程之基礎(chǔ)使用篇

    Netty學(xué)習(xí)教程之基礎(chǔ)使用篇

    Netty是由JBOSS提供的一個Java開源框架。Netty提供異步的、事件驅(qū)動的網(wǎng)絡(luò)應(yīng)用程序框架和工具,用以快速開發(fā)高性能、高可靠性的網(wǎng)絡(luò)服務(wù)器和客戶端程序。下面這篇文章主要給大家介紹了關(guān)于Netty基礎(chǔ)使用的相關(guān)資料,需要的朋友可以參考下。
    2017-05-05
  • SpringBoot配置文件方式,在線yml文件轉(zhuǎn)properties

    SpringBoot配置文件方式,在線yml文件轉(zhuǎn)properties

    這篇文章主要介紹了SpringBoot配置文件方式,在線yml文件轉(zhuǎn)properties,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • SpringBoot將Bean放入容器的五種方式

    SpringBoot將Bean放入容器的五種方式

    這篇文章給大家介紹了SpringBoot將Bean放入容器的五種方式,文中通過代碼示例給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • Spring?Security實現(xiàn)接口放通的方法詳解

    Spring?Security實現(xiàn)接口放通的方法詳解

    在用Spring?Security項目開發(fā)中,有時候需要放通某一個接口時,我們需要在配置中把接口地址配置上,這樣做有時候顯得麻煩。本文將通過一個注解的方式快速實現(xiàn)接口放通,感興趣的可以了解一下
    2022-05-05
  • Android應(yīng)用開發(fā)之將SQLite和APK一起打包的方法

    Android應(yīng)用開發(fā)之將SQLite和APK一起打包的方法

    這篇文章主要介紹了Android應(yīng)用開發(fā)之將SQLite和APK一起打包的方法,文章時間較早,盡管現(xiàn)在開發(fā)環(huán)境已大都遷移至Android Studio上,但打包原理依然相同,需要的朋友可以參考下
    2015-08-08

最新評論