在網上很多都把Advice翻譯成增強器,其實從翻譯工具上看到,這個單詞翻譯是忠告,通知的意思。
首先這個注解實在Spring Web包下,而Spring MVC離不開Spring Web的依賴,所以經常兩個一起使用的。
題外:如果在asp.net webform下可以做這樣的事情有兩處地方,全部集成Base或者Globals去攔截,而在asp.net webmvc下提供了指定類進行注入,Globals同樣也有,並且可以實現,但提倡這個,mvc已經有了新的類實現全局,以上是dotnet的等等。
@ControllerAdvice的做可以可以全局攔截指定的異常,並做想要的包裝處理,比如跳轉到別的頁面,或者返回指定的數據格式等等。
下面是通過這個特定實現的簡單攔截:
1、新建MyControllerAdvice類
package com.jsoft.springboottest.springboottest1.controller; import org.springframework.ui.Model; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.*; import org.springframework.web.context.request.NativeWebRequest; import java.util.HashMap; import java.util.Map; /** * Controller增強器 * * @author jim * @date 2017/11/23 */ @ControllerAdvice public class MyControllerAdvice { @ModelAttribute public void changeModel(Model model) { System.out.println("============應用到所有@RequestMapping注解方法,在其執行之前把返回值放入Model"); model.addAttribute("author", "Jim"); } @InitBinder public void initBinder(WebDataBinder binder) { System.out.println("============應用到所有@RequestMapping注解方法,在其執行之前初始化數據綁定器"); } /** * 設置要捕獲的異常,並作出處理 * 注意:這里可以返回試圖,也可以放回JSON,這里就當做一個Controller使用 * * @param request {@link NativeWebRequest} * @param e {@link Exception} * @return {@link Map} */ @ExceptionHandler(value = Exception.class) @ResponseBody public Map processUnauthenticatedException(NativeWebRequest request, Exception e) { System.out.println("===========應用到所有@RequestMapping注解的方法,在其拋出Exception異常時執行"); Map map = new HashMap(5); map.put("code", 404); map.put("msg", e.getMessage()); return map; } }
2、測試異常,模擬拋出異常
@RequestMapping("/show") public String show() throws Exception { throw new Exception("測試異常"); }
測試效果:
測試工程:https://github.com/easonjim/5_java_example/tree/master/springboottest/springboottest9
參考: