之前,我們介紹過@ModelAttribute
和@ExceptionHandler
,前者可以往請求的Model里加數據,后者可以接受請求處理方法拋出的異常。但是他們放在控制器(Controller)里的時候,作用范圍是有限的,只管當前控制器里的方法。如果你有幾百個控制器,在每個控制器里都加上類似的代碼,不免有點冗余和費勁兒。Spring框架提供了@ControllerAdvice
注解,幫助你將其應用到所有的控制器上。
Controller Advice字面上意思是“控制器通知”,Advice除了“勸告”、“意見”之外,還有“通知”的意思。你可以將@ModelAttribute
和@ExceptionHandler
標記的方法提取出來,放到一個類里,并將加上@ControllerAdvice
,這樣,所有的控制器都可以用了:
因為@ControllerAdvice
被元注解@Component
標記,所以它也是可以被組件掃描掃到并放入Spring容器的。
如果你只想對一部分控制器添加通知,比如某個包下的控制器,可以這樣寫:
如果你不想把包名寫死,不如把包里的某個類傳進去,這樣包名重構了也不怕:
如果你只想對某幾個控制器添加通知,可以這樣寫:
挺簡單的是不是?
通知里的@ModelAttribute
方法會先于控制器里執行。通知里的@ExceptionHandler
方法優先級會低于控制器里的。仔細想想就能明白,局部的要優先于全局的。
控制器通知還有一個兄弟,@RestControllerAdvice
,如果用了它,錯誤處理方法的返回值不會表示用的哪個視圖,而是會作為HTTP body處理,即相當于錯誤處理方法加了@ResponseBody
注解。
原文鏈接:fookwood.com/spring-boot…