spring mvc 统一异常处理

一、定义一个统一异常处理类java

@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>扫描时也能扫描到,不须要在配置文件配置web

但若是你的spring-mvc配置文件使用以下方式扫描beanspring

<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包含进来,不然不起做用:express

<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>

一、@ModelAttribute注解的方法做用请参考 SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解——跟着开涛学SpringMVC 中的【2、暴露表单引用对象为模型数据】,做用是同样的,只不过此处是对全部的@RequestMapping注解的方法都起做用。当须要设置全局数据时比较有用。spring-mvc

二、@InitBinder注解的方法做用请参考 SpringMVC数据类型转换——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC ,同1相似。当须要全局注册时比较有用。mvc

三、@ExceptionHandler,异常处理器,此注解的做用是当出现其定义的异常时进行处理的方法,其可使用springmvc提供的数据绑 定,好比注入HttpServletRequest等,还能够接受一个当前抛出的Throwable对象。能够参考javadoc或snowolf的 Spring 注解学习手札(八)补遗——@ExceptionHandlerapp

@ModelAttribute 和 @InitBinder 用得很少,统一异常处理类其实也不必写出这两个引用注解的方法,直接保留@ExceptionHandler注解的方法便可学习

即把@ControllerAdvice注解内部使用@ExceptionHandler、@InitBinder、@ModelAttribute注解 的方法应用到全部的 @RequestMapping注解的方法。很是简单,不过只有当使用@ExceptionHandler最有用,另外两个用处不大。ui

该 @ControllerAdvice 注解很是简单,能够把异常处理器应用到全部控制器 @Controller ,而不是@Controller注解的单个控制器。 单个控制器请用 @ExceptionHandler 注解,这样在该异常处理器对当前控制器的全部方法有效。.net

若是某控制器须要自定义处理异常,不用顶层的异常处理器,请在当前控制器内用 @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

相关文章
相关标签/搜索