spring mvc 统一异常处理

原创
2016/06/24 17:38
阅读数 1.1K

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

 

 

展开阅读全文
打赏
0
5 收藏
分享
加载中
更多评论
打赏
0 评论
5 收藏
0
分享
返回顶部
顶部