官术网_书友最值得收藏!

4.4 @ControllerAdvice

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

4.4.1 全局異常處理

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

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

圖4-8

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

然后在resources/templates目錄下創建error.html文件,內容如下:

此時上傳出錯效果與圖4-8一致。

4.4.2 添加全局數據

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

代碼解釋:


? 在全局配置中添加userInfo方法,返回一個map。該方法有一個注解@ModelAttribute,其中的value屬性表示這條返回數據的key,而方法的返回值是返回數據的value。

? 此時在任意請求的Controller中,通過方法參數中的Model都可以獲取info的數據。


Controller示例代碼如下:

在請求方法中,將Model中的數據打印出來,如圖4-9所示。

圖4-9

4.4.3 請求參數預處理

@ControllerAdvice結合@InitBinder還能實現請求參數預處理,即將表單中的數據綁定到實體類上時進行一些額外處理。

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

在Controller上需要接收兩個實體類的數據,Controller中的方法定義如下:

此時在參數傳遞時,兩個實體類中的name屬性會混淆,@ControllerAdvice結合@InitBinder可以順利解決該問題。配置步驟如下。

首先給Controller中方法的參數添加@ModelAttribute注解,代碼如下:

然后配置@ControllerAdvice,代碼如下:

代碼解釋:


? 在GlobalConfig類中創建兩個方法,第一個@InitBinder("b")表示該方法是處理@ModelAttribute("b")對應的參數的,第二個@InitBinder("a")表示該方法是處理@ModelAttribute("a")對應的參數的。

? 在每個方法中給相應的Field設置一個前綴,然后在瀏覽器中請求http://localhost:8080/book?b.name=三國演義&b.author=羅貫中&a.name=曹雪芹&a.age=48,即可成功地區分出name屬性。

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

主站蜘蛛池模板: 扬州市| 罗山县| 临安市| 河津市| 黔西县| 库尔勒市| 乃东县| 建昌县| 怀远县| 郧西县| 巴林左旗| 高陵县| 清流县| 门源| 连江县| 综艺| 宁阳县| 海宁市| 古丈县| 辉南县| 旬邑县| 靖江市| 德保县| 临泽县| 青浦区| 来安县| 夏津县| 嘉义市| 井陉县| 新疆| 凉城县| 盘锦市| 通榆县| 都昌县| 津南区| 临桂县| 临西县| 三都| 台前县| 丽江市| 阜阳市|