0

我目前正在尝试使用aspectj和spring aop围绕对HttpServletResponse.sendRedirect(api文档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 文档中看出它不需要任何特殊的语法。

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

总而言之,我被难住了,有什么想法吗?

4

1 回答 1

0

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

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

于 2014-06-20T18:16:22.423 回答