Java Spring AOP切入点不工作?

Java Spring AOP切入点不工作?,java,spring-aop,Java,Spring Aop,下面是我的代码片段: ServiceImpl.java @服务 公共类ServiceImpl实现服务{ 私有响应workerAudit发送引发异常{ System.out.PrintLn步骤1; workersend.getRequest,send.getId; } 私有响应workerRequest请求,字符串id引发ArgumentException{ System.out.println步骤2; 试一试{ //抛出一些异常 }捕获异常e{ System.out.PrintLn步骤3; }

下面是我的代码片段:

ServiceImpl.java

@服务 公共类ServiceImpl实现服务{ 私有响应workerAudit发送引发异常{ System.out.PrintLn步骤1; workersend.getRequest,send.getId; } 私有响应workerRequest请求,字符串id引发ArgumentException{ System.out.println步骤2; 试一试{ //抛出一些异常 }捕获异常e{ System.out.PrintLn步骤3; } } } 现在,我想要的是每当从workerRequest方法抛出NullPointerException时,字符串id如上所示,我想要执行一些特定的任务。为此,我编写了一个方面类,如下所示:

MyAspect.java

@面貌 @组成部分 公共类MyAspect{ @Pointcutcom.xyz.myapp.ServiceImpl.worker&&argsrequest,。。 私有void someOperationRequest请求{} @在某些操作请求之前 公共无效处理请求{ System.out.println成功; } @后工作流com.xyz.myapp.ServiceImpl.worker&&argsrequest,。。 公共无效或撤销{ System.out.println异常\u成功; } } 电流输出:

步骤1 步骤2 步骤3 期望输出:

步骤1 步骤2 步骤3 成功 例外与成功 如您所见,MyAspect.java未被触发,因此未打印值。 这是什么原因呢

注:

我也试着让工人上公共课,但没用

还尝试更改方法的名称,以消除任何也不起作用的重载问题

到目前为止,尝试过各种其他切入点表达式都是徒劳的

在我的应用程序中,还有其他方面类工作得非常好


您犯了一个典型的SpringAOP初学者的错误:您假设它适用于私有方法,但正如文档中明确指出的,它不适用。SpringAOP基于动态代理,当通过JDK代理实现接口时,这些代理仅适用于公共方法,另外,当使用CGLIB代理时,这些代理还适用于受保护和包范围的方法

如果要从一个方面截获worker方法,应该将其公开

注:成熟的AspectJ也适用于私有方法,但在这里切换到另一个AOP框架将是过分的

更新:代码中还有其他问题:

第一个worker方法,即使是公开的,也不会返回任何内容。最后一条语句应该是return workersend.getRequest,send.getId;,不仅仅是workersend.getRequest,还有send.getId;。 切入点com.xyz.myapp.ServiceImpl.worker将永远不匹配,因为它有一个空参数列表,但您的方法有参数。args在这里帮不了你。 切入点的语法也是错误的,因为它没有为方法指定返回类型,甚至没有*。此外,方法名本身是不够的,它应该包含在实际的切入点类型中,例如execution。也就是说,你想写一些像: @Pointcutexecution*com.xyz.myapp.ServiceImpl.worker..&&argsrequest。。 私有void someOperationRequest请求{}
要截获引发异常的方法,您可以使用以下代码,仅当方法是公共的:

 @AfterThrowing(pointcut="com.xyz.myapp.SystemArchitecture.dataAccessOperation()",throwing="ex")
         public void doRecoveryActions(NullPointerException ex) {
          // ...
         }

来源:

您是否确保将MyAspect添加到您的应用程序上下文中?我想我没有为此做任何输入。我也不知道应用程序上下文到底是什么/在哪里。我正在处理一个现有的系统。我将首先确保sprint知道MyAspect,即它已添加到应用程序上下文中。这通常通过application-context.xml或类路径扫描来完成。类上已经有了@Component,这很好,但是您只需要确保spring知道该类。在您费心缩小方面的范围之前,首先应该运行它。我认为阅读《精致弹簧手册》是有意义的,尤其是关于弹簧的章节,如果之后您还有问题,请回到这里。作为一个新手在现有的应用程序上工作并不是在你把代码弄糟之前不去了解那里使用的技术的借口。我无意冒犯你,但是StackOverflow很难成为您将工作委派给其他人的合适平台。如果您想在这里得到好的答案,请向您提出另一个建议:请创建一个新的平台,以便其他用户能够重现并理解您的问题。我也尝试将其公开,但这对我来说也不起作用。AOP在其他情况下是否在特定的环境中起作用同一个项目?我们需要找出是否存在配置问题,或者只是您方面的问题。是的,它在同一个项目中工作。我也检查了其他类,发现它们是独立类,即它们没有扩展/实现任何其他类/接口。但是在我的例子中,这个类实现了一个接口Service.java。还有一件事,方法工作者只特定于我的类,它不是被重写的方法。