1、定义一个统一异常处理类
@ControllerAdvice
public class ExptionTest {
@ExceptionHandler(Exception.class)
@ResponseBody
public Object exp(Exception exception){
Map<String, Object> map = new HashMap<String, Object>();
map.put("error", "顶层错误处理");
map.put("errorInfo", exception);
map.put("errorInfo2", exception.getMessage());
StringWriter s = new StringWriter();
PrintWriter pw=new PrintWriter(s);
exception.printStackTrace(pw);
map.put("errorInfo3", s.toString());
return map;
}
@ModelAttribute
public User newUser() {
System.out.println("============应用到所有@RequestMapping注解方法,在其执行之前把返回值放入Model");
return new User();
}
@InitBinder
public void initBinder(WebDataBinder binder) {
System.out.println("============应用到所有@RequestMapping注解方法,在其执行之前初始化数据绑定器");
}
}
@ControllerAdvice,是spring3.2提供的新注解, 一般扫描<context:component-scan>扫描时也能扫描到,不需要在配置文件配置
但如果你的spring-mvc配置文件使用如下方式扫描bean
<context:component-scan base-package="com.sishuok.es" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
需要把 @ControllerAdvice包含进来,否则不起作用:
<context:component-scan base-package="com.sishuok.es" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
</context:component-scan>
1、@ModelAttribute注解的方法作用请参考 SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解——跟着开涛学SpringMVC 中的【二、暴露表单引用对象为模型数据】,作用是一样的,只不过此处是对所有的@RequestMapping注解的方法都起作用。当需要设置全局数据时比较有用。
2、@InitBinder注解的方法作用请参考 SpringMVC数据类型转换——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC ,同1类似。当需要全局注册时比较有用。
3、@ExceptionHandler,异常处理器,此注解的作用是当出现其定义的异常时进行处理的方法,其可以使用springmvc提供的数据绑 定,比如注入HttpServletRequest等,还可以接受一个当前抛出的Throwable对象。可以参考javadoc或snowolf的 Spring 注解学习手札(八)补遗——@ExceptionHandler 。
@ModelAttribute 和 @InitBinder 用得不多,统一异常处理类其实也没必要写出这两个引用注解的方法,直接保留@ExceptionHandler注解的方法即可
即把@ControllerAdvice注解内部使用@ExceptionHandler、@InitBinder、@ModelAttribute注解 的方法应用到所有的 @RequestMapping注解的方法。非常简单,不过只有当使用@ExceptionHandler最有用,另外两个用处不大。
该 @ControllerAdvice 注解非常简单,可以把异常处理器应用到所有控制器 @Controller ,而不是@Controller注解的单个控制器。 单个控制器请用 @ExceptionHandler 注解,这样在该异常处理器对当前控制器的所有方法有效。
如果某控制器需要自定义处理异常,不用顶层的异常处理器,请在当前控制器内用 @ExceptionHandler 注解 ,这样当前控制器的异常处理就在当前类
作用域:@ControllerAdvice > @ExceptionHandler > try catch
优先级: try catch > @ExceptionHandler > @ControllerAdvice
转载参考:http://jinnianshilongnian.iteye.com/blog/1866350?utm_source=tuicool&utm_medium=referral
http://blog.csdn.net/ufo2910628/article/details/40399539