Java AspectJ拦截器不工作

Java AspectJ拦截器不工作,java,aop,aspectj,spring-aop,interceptor,Java,Aop,Aspectj,Spring Aop,Interceptor,我创建了一个AspectJ拦截器,如 @Aspect public class RequestSpecificServiceAspect { @Pointcut("execution( * com.mycompany.c.d.doesTreatmentEqualsAndTrigger(..))") private void callInterceptor(){} @Before("callInterceptor()") public void getCallSt

我创建了一个AspectJ拦截器,如

@Aspect
public class RequestSpecificServiceAspect {
    @Pointcut("execution( * com.mycompany.c.d.doesTreatmentEqualsAndTrigger(..))")
    private void callInterceptor(){}

    @Before("callInterceptor()")
    public void getCallStack(){
    StackTraceElement[] callingStack = Thread.currentThread().getStackTrace();
    PopulateServiceDependentMap populateServiceDependentMap = new PopulateServiceDependentMap();
    populateServiceDependentMap.populateMap(callingStack, "ServiceName");
    }
}
这工作得很好,因为这是一个试用代码,我现在用我想要的实际拦截器替换了它,就像这样

@Pointcut("execution( * mycompany.f.g.findPluginForRequest(..)) && args(request)")
private void actualInterceptor(BSFBatchRequest request){}

@Before("actualInterceptor(request)")
public void getBSFCall(BSFBatchRequest request){ 
    StackTraceElement[] callingStack = Thread.currentThread().getStackTrace();
    PopulateServiceDependentMap populateServiceDependentMap = new PopulateServiceDependentMap();
    populateServiceDependentMap.populateMap(callingStack, request);
}
但是现在我的拦截器没有拦截对
findPluginForRequest()
函数的调用。 为什么会发生这种情况?我如何修复它

这是我的spring配置文件(.xml):


但它仍然不起作用。

我觉得它不错,但我不确定您是否错过了
@Aspect
。另一种方法是在一个地方将切入点和建议结合起来。为了避免包名中出现任何错误,我将
e.f.g.findPluginForRequest
替换为
findPluginForRequest
。一旦确定包名中没有错误,就可以将其放回原处

@Aspect
public class LoggingAspect {

    @Before("execution(* findPluginForRequest(..))&& args(request)")
    public void beforeeAdvice(BSFBatchRequest request ){

    }

}

现在您终于共享了方法签名,我可以回答您的问题:

private AllPurposeCache findPluginForRequest(
最终BSFBatchRequest请求
)
SpringAOP不如AspectJ强大,因为它不直接编织字节码,而是基于通过JDK或CGLIB创建/使用动态代理。动态代理只是实现接口的子类或类。因此,它们只覆盖公共方法。您的方法是私有的,因此Spring AOP无法拦截它。这记录在以下文件中:

由于Spring的AOP框架基于代理的特性,受保护的方法根据定义是不被拦截的,既不适用于JDK代理(如果这不适用),也不适用于CGLIB代理(如果这在技术上是可能的,但不推荐用于AOP目的)。因此,任何给定的切入点将只与公共方法匹配! 如果您的拦截需要包括受保护的/私有的方法,甚至是构造函数,请考虑使用Spring驱动的原生AspectJ编织,而不是Spring基于代理的AOP框架。这构成了一种不同的AOP使用模式,具有不同的特性,因此在做出决定之前,一定要先熟悉编织

为了让它工作,要么公开该方法,要么切换到AspectJ


附言:这本可以更容易、更快。请学习并了解如何提供。谢谢。

我需要更多信息。请显示
findPluginForRequest
的包名和签名,并告诉我如果没有删除
args()
部分和切入点/建议参数,if是否有效。另一个问题:在第一个示例中,您调用
populateMap
,第二个参数是字符串,现在它是一个请求对象。这是为什么?我不能告诉你NDAs的原因,但我可以告诉你,这是一个正常的包。而且,即使没有
args()
部分,它也无法工作。为了回答第二个问题,我使用一个请求对象调用它,因为这个请求对象有一个方法,它返回一个字符串和我需要的更多数据。早些时候,因为这是一个试验,我只是硬编码了数据,并传递了字符串来检查它是否工作。你需要帮助,但不愿意分享足够的信息。我要的是
findPluginForRequest
的签名。除非我至少看到了整个画面的重要部分,否则这是一个让人猜测的问答节目,不是一个可以通过演绎来回答的有意义的问题。
findPluginForRequest
的签名是
private AllPurposeCache findPluginForRequest(最终BSFBatchRequest请求)
。也与此无关,但AspectJ拦截器是否会导致超时?此代码位于带有
@Aspect
注释的类中,所以没有问题。我将尝试将其结合起来,并让您知道。我可以直接在java中使用AspectJ并对xml进行一些更改吗?如果我能像SpringAOP一样使用AspectJ,那就太好了。这不是因为你不想公开一个方法而过度杀戮吗?我认为将其公开是合理的,因为您希望通过AOP从中进行交互。链接文档的第11.8章解释了如何配置AspectJ。RTFM,谢谢。切换的决定不应掉以轻心,虽然语法相同,但实际上是不同的。你似乎对AOP知之甚少,小心不要用大炮射杀蚊子。这和你说的一模一样。我是AOP的新手,知道的不多。问题还在于,我试图拦截的方法属于其他团队,他们不允许将其公开。告诉他们代码不属于他们的团队,而是属于公司。如果你的工作是实现一个涉及他们代码的交叉关注点,他们应该改变它。或者,你需要找另一个地方去钓。让我们在这里停止讨论,这不再是技术问题。
@Pointcut("execution(private * mycompany.f.g.findPluginForRequest(..)) && args(request)")
private void actualInterceptor(BSFBatchRequest request){}
@Aspect
public class LoggingAspect {

    @Before("execution(* findPluginForRequest(..))&& args(request)")
    public void beforeeAdvice(BSFBatchRequest request ){

    }

}