`
yushl
  • 浏览: 11585 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Spring AOP拦截Exception重新抛出让Spring MVC拦截器拦截

    博客分类:
  • java
 
阅读更多

       今天遇到一个问题,并不是技术上很牛逼,只是有一点灵异,如何灵异的呢?因为我第一次部署测试没有反应,但是当我实在是hold不住,调试spring mvc源码的时候,它悄悄的,竟然好了。。。。。由此而产生的最直接后果是,当第一次我测试失败后,我直接否定了这个方案转而尝试其他方案,结果导致了我浪费了很多时间。。。。。

        个中蛋疼问题,心力憔悴之处暂且不表,言归正传。

         应用场景:

         Spring MVC中拦截器拦截项目中的Exception,这很正常,不正常的是,要求在拦截这个异常的时候记录下发生异常的方法名,参数,在Spring MVC的拦截器中我们实现了HandlerExceptionResolver,重写的方法为public ModelAndView resolveException(HttpServletRequest request,
                                         HttpServletResponse response, Object handler, Exception ex) {}

在这里我只拿到Exception的信息,而无法直接得知出错的方法名和出错时的参数。

因为Spring MVC的容器和Spring Core的容器不是同一个,这个问题的关键,我无法直接获取我想要的信息,好吧,为了我那可怜的工资,我辈只能奋不顾身。

        PS :因为一些信息的原因,有些敏感字符也删除,各位勿喷。

      首先:定义一个AOP,先写一个简单的Class,

          public class ExceptionAdvisor{

     public void afterThrowing(JoinPoint joinPoint, Exception ex) {
         Method method = ((MethodSignature)joinPoint.getSignature()).getMethod();
         Object[] args = joinPoint.getArgs();
         String methodName = method.getName();
         StringBuilder builder =  new StringBuilder(512);
         builder.append("\nMethod Name is :").append(methodName).append("\n");
         if (args != null) {
             int size =  args.length;
             builder.append("Method Args:\n");
            for (int index = 0; index < size; index ++) {
                Object object = args[index];
                builder.append("args[").append(index).append("]:").append(object.toString()).append("\n");
            }
        }
         builder.append(ex.getMessage());
         throw new RuntimeException(builder.toString());
     }
}

注意上述的做法是,先把我需要的信息拼装起来,然后重新throw一个RuntimeException

 

同样的,上配置文件:

         <bean id="exceptionadvice" class="com.playsnail.platform.exception.handler.ExceptionAdvisor" />
   
    <aop:config proxy-target-class="true"> 
        <aop:aspect ref="exceptionadvice" > 
            <aop:after-throwing method="afterThrowing" pointcut="execution (*           路径..*.*(..))" throwing="ex"/> 
        </aop:aspect> 
    </aop:config> 

 

这样便拦截到了Spring core里面的异常。

 

当我们throw新的RuntimeException后,就需要Spring MVC的拦截器闪亮登场。

public class ExceptionHandler implements HandlerExceptionResolver {
   
    @Override
    public ModelAndView resolveException(HttpServletRequest request,
                                         HttpServletResponse response, Object handler, Exception ex) {
       //此处的Exception就是AOP重新抛出的Exception了,现在对重新抛出的异常做你想做的事情
        return new ModelAndView();
    }

 

同样的,不能少了配置文件,在spring MVC的配置文件中增加

<bean id="exceptionResolver" class="路径.ExceptionHandler "></bean>

OK, 简单吧,但是摸索的过程是痛苦的,特别有一些灵异事件以后。

上面是milestone版,后期可能会出现一些变动,还需要实践的证明,各位看官有什么指正之处或者有什么更好的办法,欢迎各位狂喷。

分享到:
评论

相关推荐

    SpringMVC拦截器例子详解

    下面将详细解释Spring MVC拦截器的工作原理、配置和实际应用。 1. **工作原理**: - 拦截器是基于AOP(面向切面编程)思想实现的,它通过预处理器和后处理器模式,对HTTP请求进行拦截。 - 当一个请求到达Spring ...

    SpringMVC拦截器

    5. 在 SpringMVC 的配置文件中注册拦截器,通常是在 `&lt;mvc:interceptors&gt;` 标签内使用 `&lt;bean&gt;` 标签定义拦截器,并在 `&lt;mvc:mapping&gt;` 中指定拦截的路径。 例如,一个简单的权限验证拦截器可能如下所示: ```java...

    springboot拦截器代码

    总结来说,Spring Boot中的拦截器是实现业务逻辑增强的关键工具,通过实现HandlerInterceptor接口并注册到Spring MVC配置中,我们可以灵活地控制请求的生命周期,从而提高应用的功能性和灵活性。在设计和实现拦截器...

    SpringMVC 拦截器实现分析.docx

    以下是关于Spring MVC拦截器实现的详细分析: 1. **拦截器接口与方法**: Spring MVC的拦截器接口是`HandlerInterceptor`,它提供了三个关键方法: - `preHandle(HttpServletRequest request, ...

    基于springMVC的session拦截器

    - `afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)`:在整个请求处理完成后调用,无论是否有异常抛出。可以用来释放资源或者进行日志记录。 4. **...

    (代码)SpringMVC第11讲:拦截器

    除了自定义的拦截器,Spring MVC还提供了一个默认的异常处理器,它会捕获Controller方法抛出的异常,并根据异常类型进行相应处理。开发者可以扩展这个类来定制错误页面或者返回JSON格式的错误信息。 5. **Spring ...

    HelloSpringMVC.zip(拦截器)

    下面将详细阐述Spring MVC拦截器的工作原理、使用场景以及如何创建和配置。 1. **拦截器的工作原理** 拦截器是基于AOP(面向切面编程)的概念,它在控制器处理请求之前和之后执行一系列预定义的方法。在Spring MVC...

    springboot拦截器

    - **拦截器**属于Spring MVC的组成部分,运行在Servlet容器的上下文中,依赖于Spring的AOP代理。 - **过滤器**遵循Servlet规范,适用于所有类型的Web应用,独立于Spring框架。 总结,SpringBoot的拦截器提供了灵活...

    springmvc-interceptor

    本文将深入探讨Spring MVC拦截器的使用。 ### 一、拦截器概念 拦截器是基于AOP(面向切面编程)思想实现的,它可以理解为一个过滤器,拦截用户请求并进行预处理。Spring MVC提供了一个`HandlerInterceptor`接口,...

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

    `@ControllerAdvice`是Spring MVC提供的一个注解,用于定义一个全局的异常处理器,它可以捕获并处理所有`@RequestMapping`注解的方法抛出的异常。下面是一个简单的`@ControllerAdvice`示例: ```java import org....

    Spring系列面试题129道(附答案解析)

    43、指出在springaop中concern和cross-cuttingconcern的不同之处。 在Spring AOP中,concern指的是应用程序中的业务逻辑代码,而cross-cutting concern是横切关注点,如日志记录、事务管理等,这些关注点贯穿多个...

    java学习(ssh) action structs spring hibernet

    `throw`和`throws`关键字用于抛出异常和声明异常,其中`throw`用于在方法内部抛出一个异常实例,而`throws`则用于在方法签名中声明可能抛出的异常类型。 ### 3. Java反射机制 Java反射允许程序在运行时获取类的信息...

    MyGlobalException.zip

    2. **@ControllerAdvice**: 这个注解是Spring MVC的一个特性,用于标记一个类为控制器的全局顾问,它会拦截所有带有@RequestMapping、@GetMapping、@PostMapping等注解的方法抛出的异常。在类中定义一个异常处理方法...

    java面试题

    这类异常没法要求程序员去一一捕获并抛出,一般异常是Java类库或程序员自己写的代码发生的错误,这类异常可以由我们去一一捕获并抛出。 多线程几种实现方法,同步? 答:多线程有两种实现方法,一种是继承Thread类...

    structs2.0源码

    9. **Exception Handler(异常处理器)**:Struts2提供了一种优雅的异常处理机制,可以全局处理Action执行过程中抛出的异常,并指定相应的结果。 10. **Struts2与Spring集成**:Struts2可以方便地与Spring框架集成...

    java_Javaweb_SSH框架面试题大全

    - **finally**:在try-catch块中,无论是否抛出异常,finally块内的代码总会被执行。 - **finalize**:对象被垃圾回收前,Java会尝试调用此方法进行资源清理,但不保证一定会执行。 以上就是对"java_Javaweb_SSH...

    struts课件

    9. **Exception Handling**:Struts提供了全局的异常处理机制,可以捕获和处理Action执行过程中抛出的异常,提供统一的错误页面。 10. **Internationalization国际化**:Struts支持多语言环境,通过资源包...

    Struts项目实施经验

    - Struts框架提供全局的Exception Handler,可以统一处理应用中抛出的异常,并导航到错误页面。 10. **Struts与Spring集成** - 可以通过Spring-Struts整合,利用Spring的依赖注入(DI)和面向切面编程(AOP)特性...

    项目说明1

    - `exception`模块中的`HrException.java`定义了系统中可能抛出的自定义异常。 - `schedule`模块包含`PayJob.java`和`PunchJob.java`,实现了薪酬计算和打卡处理的调度任务。 - `magicgis.hrsystem.web`包含了...

    一些比较经典的java面试题

    - **exception**: 如果JSP页面定义为错误处理页,则此对象包含抛出的异常信息。 #### 2、Servlets的生命周期? Servlet的生命周期包括以下几个阶段: - **加载和实例化**:当服务器启动时,或首次请求Servlet时,...

Global site tag (gtag.js) - Google Analytics