【发布时间】:2017-03-22 11:35:26
【问题描述】:
下面是我的代码sn-p:
ServiceImpl.java
@Service
public class ServiceImpl implements Service {
private Response worker(Audit send) throws ArgumentException {
System.out.println("STEP_1");
worker(send.getRequest(), send.getId());
}
private Response worker(Request request, String id) throws ArgumentException {
System.out.println("STEP_2");
try {
//throwing some exception
} catch (Exception e) {
System.out.println("STEP_3");
}
}
}
现在,我想要的是每当NullPointerException 被从方法worker(Request request, String id) 抛出时,如上所示,我想要执行一些特定的任务。为此,我编写了一个 Aspect 类,如下所示:
MyAspect.java
@Aspect
@Component
public class MyAspect{
@Pointcut("com.xyz.myapp.ServiceImpl.worker() && args(request,..)")
private void someOperation(Request request) {}
@Before("someOperation(request)")
public void process(Request request) {
System.out.println("SUCCESS");
}
@AfterThrowing("com.xyz.myapp.ServiceImpl.worker() && args(request,..)")
public void doRecoveryActions() {
System.out.println("EXCEPTION_SUCCESS");
}
}
电流输出:
STEP_1
STEP_2
STEP_3
所需的输出:
STEP_1
STEP_2
STEP_3
SUCCESS
EXCEPTION_SUCCESS
如您所见,MyAspect.java 没有被触发,因此不会打印值。
这可能是什么原因?
注意:
我也尝试将 worker 设为公共课程,但没有成功。
还尝试更改方法的名称以消除任何同样不起作用的重载问题。
到目前为止,尝试了各种其他切入点表达式都是徒劳的。
在我的应用程序中,还有其他方面类工作得非常好。
【问题讨论】:
-
您是否确保已将 MyAspect 添加到您的应用程序上下文中?
-
我认为我没有为此输入任何条目。另外我不知道应用程序上下文到底是什么/在哪里。我正在使用现有系统。
-
我会首先确保 sprint 知道 MyAspect(即它已被添加到应用程序上下文中)。这通常通过
application-context.xml或通过类路径扫描来完成。你已经在类上有@Component,这很好,但你只需要确保 spring 知道这个类。 -
在您费心缩小方面的范围之前,首先应该运行它。我认为阅读精美的 Spring 手册是有意义的,尤其是关于 Spring AOP 的章节,如果之后您还有问题,请回到这里。作为一个新手在现有的应用程序上工作不是不学习那里使用的技术的借口,因为你弄乱了代码。我无意冒犯,但 StackOverflow 并不是您将工作委派给他人的合适平台。
-
如果您想在这里得到好的答案,给您的另一个建议:请创建一个Minimal, Complete, and Verifiable example,以便其他用户能够重现和理解您的问题。
标签: java spring-aop