Spring MVC中@ControllerAdvice注解实现全局异常拦截
在网上很多都把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
参考: