- Spring Boot+Vue全棧開發實戰
- 王松
- 895字
- 2020-06-30 17:14:47
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對象中,還可以設置允許的字段、禁止的字段、必填字段以及驗證器等。
- UI圖標創意設計
- MySQL數據庫管理實戰
- GAE編程指南
- Spring 5.0 By Example
- JavaScript+DHTML語法與范例詳解詞典
- Hands-On Image Processing with Python
- 實用防銹油配方與制備200例
- SharePoint Development with the SharePoint Framework
- SQL Server 2016數據庫應用與開發
- HTML+CSS+JavaScript編程入門指南(全2冊)
- 遠方:兩位持續創業者的點滴思考
- Instant Apache Camel Messaging System
- Azure for Architects
- HoloLens Blueprints
- NIO與Socket編程技術指南