在对HttpServletResponse进行切入之前,sendRedirect编译但不会触发

时间:2014-06-20 17:39:52

标签: spring groovy aop aspectj pointcut

我正在尝试使用aspectj和spring aop在HttpServletResponse.sendRedirect(api doc http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletResponse.html)的调用周围添加一个切入点。类和切入点的代码如下:

@Aspect
@Log4j
class ExampleAspect {

    @Before("execution(* javax.servlet.http.HttpServletResponse.sendRedirect(..))")
    void logRedirectBeforeSending() {
          log.warn('holy cow batman, its a redirect!')
    }
}

目前虽然上面的代码编译它实际上并没有执行(由于日志和调试断点中缺少警告输出所证明,建议代码永远不会被命中)。

虽然我在这里省略了它们只是为了简单起见,方面包含其他正确触发的切入点,因此我排除了方面配置作为潜在原因(这就是为什么我不包括我的spring bean配置)。

此外,我通过调试双重检查,当我测试我的切入点时,正在调用实现HttpServletResponse.sendRedirect()的类(如果它有帮助,则调用的一个实现类是org.apache.catalina。 connector.Response https://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/connector/Response.html)。

我的切入点定义中是否存在我在定义界面周围的切入点时需要的东西?我可以从Spring AOP文档中看出它不需要任何特殊语法。

我一直在玩切入点定义的变化,但还没有运气。

总而言之,我很难过,有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我希望您的响应对象不是来自Spring应用程序上下文,因此它不会受您的影响。

调用是从Spring bean启动的并不重要。重要的是调用是在Spring bean上调用的。例如,如果您在StringBuffer中编写了一个应用于追加方法的点切割,然后您执行了new StringBuffer().append('something')之类的操作,那么您的切点将不会被应用,因为您是StringBuffer与之交互不是Spring bean。我不知道您的应用程序是如何组合在一起的,但除非您的响应来自Spring上下文,否则我不希望您的应用程序被应用。