`

用@ExceptionHandler 来进行切面异常处理

    博客分类:
  • java
阅读更多
有时候我们想处理某个类里Controller中抛出的异常怎么搞呢?

直接在Controller里面加上用@ExceptionHandler标注一个处理异常的方法像下面这样子

@ExceptionHandler(MissingServletRequestParameterException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public void processMethod(MissingServletRequestParameterException ex,HttpServletRequest request ,HttpServletResponse response) throws IOException {
    System.out.println("抛异常了!"+ex.getLocalizedMessage());
    logger.error("抛异常了!"+ex.getLocalizedMessage());
    response.getWriter().printf(ex.getMessage());
    response.flushBuffer();
}

这样,Controller里面的方法抛出了MissingServletRequestParameterException异常就会执行上面的这个方法来进行异常处理。
像我下面的代码

@RequestMapping("/index")
public String index(@MyUser User user,@RequestParam String id,ModelMap modelMap){
    return "login";
}


如果我没有传入id值,那么就会抛出MissingServletRequestParameterException的异常,就会被上面的异常处理方法处理。

上面的@ExceptionHandler(MissingServletRequestParameterException.class)这个注解的value的值是一个Class[]类型的,这里的ExceptionClass是你自己指定的,你也可以指定多个需要处理的异常类型,比如这样@ExceptionHandler(value = {MissingServletRequestParameterException.class,BindException.class}),这样就会处理多个异常了。

但这个只会是在当前的Controller里面起作用,如果想在所有的Controller里面统一处理异常的话,可以用@ControllerAdvice来创建一个专门处理的类。

下面讲解@ControllerAdvice:
@ControllerAdvice,是spring3.2提供的新注解,从名字上可以看出大体意思是控制器增强。让我们先看看@ControllerAdvice的实现:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface ControllerAdvice {

}


没什么特别之处,该注解使用@Component注解,这样的话当我们使用<context:component-scan>扫描时也能扫描到。

@ControllerAdvice其javadoc里描述到:
即把@ControllerAdvice注解内部使用@ExceptionHandler、@InitBinder、@ModelAttribute注解的方法应用到所有的 @RequestMapping注解的方法。非常简单,不过只有当使用@ExceptionHandler最有用,另外两个用处不大。

接下来看段代码:
@ControllerAdvice
public class ControllerAdviceTest {

    @ModelAttribute
    public User newUser() {
        System.out.println("============应用到所有@RequestMapping注解方法,在其执行之前把返回值放入Model");
        return new User();
    }

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        System.out.println("============应用到所有@RequestMapping注解方法,在其执行之前初始化数据绑定器");
    }

    @ExceptionHandler(UnauthenticatedException.class)
    @ResponseStatus(HttpStatus.UNAUTHORIZED)
    public String processUnauthenticatedException(NativeWebRequest request, UnauthenticatedException e) {
        System.out.println("===========应用到所有@RequestMapping注解的方法,在其抛出UnauthenticatedException异常时执行");
        return "viewName"; //返回一个逻辑视图名
    }
}


如果你的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。

该注解非常简单,大多数时候其实只@ExceptionHandler比较有用,其他两个用到的场景非常少,这样可以把异常处理器应用到所有控制器,而不是@Controller注解的单个控制器。

转自:http://blog.csdn.net/u013632755/article/details/49908621
分享到:
评论

相关推荐

    利用springmvc切面捕获全局异常入库源码

    总结来说,"利用SpringMVC切面捕获全局异常入库源码"项目展示了如何使用Spring AOP来替代传统的`HandlerExceptionResolver`实现全局异常处理。通过创建自定义切面和后置通知,可以捕获任何未被特定控制器方法处理的...

    java全局异常统一处理

    例如,在Spring框架中,使用@ControllerAdvice和@ExceptionHandler注解可以定义全局异常处理类和方法。当应用程序中发生异常时,Spring会自动调用该方法来处理异常。这种方法适用于在全局范围内处理所有类型的异常。...

    SpringMVC 中的拦截器与异常处理

    此外,还可以使用`@ControllerAdvice`注解和`@ExceptionHandler`注解来定义一个全局的异常处理类。 3. 错误页面配置:在SpringMVC的配置中,可以通过`&lt;error-page&gt;`标签定义不同类型的错误代码对应的错误页面,或者...

    spring boot demo (包括异常处理 aop redis的整合)

    在"spring boot demo"项目中,你将找到关于异常处理、AOP(面向切面编程)以及 Redis 整合的实践示例。 **异常处理**在Spring Boot中通常通过`@ControllerAdvice`和`@ExceptionHandler`注解实现。`@...

    pring异常处理共5页.pdf.zip

    在Spring中,异常处理主要是通过AOP(面向切面编程)来实现的,它允许我们在不修改原有业务代码的情况下,对程序运行过程中的异常进行统一管理。 【描述】:“Spring异常处理共5页.pdf.zip” 描述中的“共5页”...

    ssm整合Demo源文件_触发异常后跳转控制

    在异常处理中,Spring MVC可以通过配置`@ExceptionHandler`注解或者全局异常处理器(如`HandlerExceptionResolver`接口实现类)来捕获并处理异常。 3. **MyBatis**:MyBatis是一个轻量级的持久层框架,它将SQL语句...

    springboot+redis+shiro单点登录,统一异常处理,统一日志

    在本项目中,我们将结合SpringBoot、Redis和Shiro来实现SSO功能,并进行统一的异常处理和日志管理。 首先,SpringBoot是一个基于Spring框架的轻量级开发工具,它简化了新Spring应用的初始搭建以及开发过程。...

    Spring Boot处理全局统一异常的两种方法与区别

    `ErrorController`的优势在于,即使在过滤器、切面或拦截器中抛出的异常,也能被正确捕获。 总结起来,Spring Boot提供的这两种异常处理方式各有优缺点。`@ControllerAdvice`和`@ExceptionHandler`注解适合处理特定...

    Springboot之自定义全局异常处理的实现

    捕获自定义异常可以使用@ExceptionHandler()注解,@ExceptionHandler()该注解作用主要在于声明一个或多个类型的异常,当符合条件的Controller抛出这些异常之后将会对这些异常进行捕获,然后按照其标注的方法的逻辑...

    SpringBoot入门教程

    在SpringBoot中,你可以使用@Aspect注解来定义一个切面,@Before、@After、@Around等注解用于定义通知(advice),即在特定方法执行前后插入的代码。 3. **异常处理** 在SpringBoot中,我们可以使用@...

    MyGlobalException.zip

    3. **SpringBoot与AOP结合**: Spring Boot可以结合Spring的面向切面编程(AOP)实现更复杂的全局异常处理。AOP允许我们定义“切面”,即跨越多个对象的行为或责任,我们可以定义一个切面来捕获和处理所有应用的异常...

    SpringBoot基础入门demo

    Spring Data JPA提供了一种声明式的方式来进行数据库操作,只需要定义Repository接口,就能实现CRUD操作。而MyBatis则允许我们编写自定义的SQL语句,具有更高的灵活性。SpringBoot通过配置文件(application....

    用户自定义异常.rar

    对于异常处理,我们可以使用`@AfterThrowing`注解来捕获并处理异常: ```java import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; import org.springframework....

    SpringMVC框架实例

    可以使用@Valid和BindingResult注解来进行数据验证,Spring会自动调用JavaBeans的Validator接口来执行验证规则。若验证失败,BindingResult对象可以提供错误信息。 本地化和国际化支持允许开发者为不同地区的用户...

    spring_mvc.zip_spring_spring mvc_springmvc_springmvc架构

    它还提供了异常处理机制,通过@ControllerAdvice和@ExceptionHandler可以全局处理异常。 Spring MVC还集成了Spring框架的其他功能,如AOP(面向切面编程)用于实现事务管理、日志记录等。另外,通过ModelAndView...

    springmvc-机制(拦截器、aop、异常).docx

    Spring MVC提供了一套完善的异常处理机制,允许开发者自定义全局或特定控制器的异常处理器,通过@ControllerAdvice或@ExceptionHandler注解进行配置,以优雅地处理程序中抛出的异常,并返回合适的视图或响应。...

    SpringMvc学习文档(教程)

    日志记录通常与异常处理紧密相关,Spring MVC提供了良好的机制来将异常记录到日志中,包括通过SLF4J和Log4j等日志框架,以及通过AOP(面向切面编程)来实现日志记录的横切关注点。 JUnit单元测试是保证代码质量的...

    java基于spring注解AOP的异常处理的方法

    在Java开发中,Spring框架是广泛使用的,而Spring AOP(面向切面编程)则提供了一种优雅的方式来处理全局的异常。本篇文章将深入探讨如何使用Spring注解AOP进行异常处理,特别是基于`@ControllerAdvice`的方式。 一...

    传智播客2016springmvc资料

    这些只是 Spring MVC 基本概念的一部分,实际的压缩包资料可能涵盖了更深入的内容,如AOP(面向切面编程)、Spring Security、Spring Data JPA、事务管理等。学习这些资料,开发者可以全面掌握 Spring MVC 的使用,...

    基于Spring和Mybatis和servlet的人员信息管理系统.zip

    异常处理通过Spring的@ControllerAdvice和@ExceptionHandler可以统一处理全局异常。事务管理则可通过Spring的@Transactional注解来实现,保证数据操作的原子性。性能优化可以从SQL优化、缓存策略、并发控制等多方面...

Global site tag (gtag.js) - Google Analytics