使用AspectJ + SpringBoot

时间:2019-07-30 14:27:16

标签: java spring spring-boot aop aspectj

你好,程序员们。

我有一个正在使用的SpringBoot Rest API,我正在尝试使用一个Aspect,该Aspect在执行带有自定义注释的方法后执行一些操作。

所以我有这个自定义注释:

@Retention(RUNTIME)
@Target(METHOD)
public @interface PublishMQ {
    String destinyName() default "";
    boolean skipNull() default true;
}

我有这方面:

@Aspect
@Component
public class PublishMQAspect {

// ...
    @After("@annotation(br.com.powertiss.utils.transaction.PublishMQ)")
    public Object publishChangeToMQ(Object returnValue, PublishMQ publishMQ) throws Throwable {
// ...

我正在尝试在服务中使用它们:

@Service
public class OperatorService {
// ...
    @PublishMQ(destinyName = "queues/Opera")
    public Operator salve(Operadora operator) {
// ...

但是我在启动时遇到了给定的异常:

java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut

PublishMQ和PublishMQAspect与OperatorService位于不同的jar中,但是我认为这不应该成为问题。

我花了好几个小时尝试了很多事情,但不明白为什么AspectJ会引发此异常。你们可以帮忙吗?谢谢。

1 个答案:

答案 0 :(得分:0)

在我回答之前,让我建设性地批评您提出问题的方式:这个问题不清楚。为什么要提供不连贯的代码段,而不是完整的类或方法?具体来说,您不会在方面建议中显示实际要使用的方法参数。所以现在我不得不猜测(我不喜欢,因为现在我的工作量比必要的多4倍,请参见下文)。谨建议您学习MCVE是什么-4k信誉用户应该已经知道-并尝试在将来提出更好的问题。


除了始终隐式可用的JoinPoint参数外,您不能使用切入点或结果中不会出现的建议方法参数。您应该阅读一些AspectJ文档,以了解有关切入点和建议语法的更多信息。

您可以选择:在您的建议方法中,您都不需要返回值和注释...

@After("@annotation(br.com.powertiss.utils.transaction.PublishMQ)")
public Object publishChangeToMQ(JoinPoint thisJoinPoint) throws Throwable {

...或者您仅需要注释值...

@After("@annotation(publishMQ)")
public Object publishChangeToMQ(JoinPoint thisJoinPoint, PublishMQ publishMQ) throws Throwable {

...或者您只需要返回值...

@AfterReturning(pointcut = "@annotation(br.com.powertiss.utils.transaction.PublishMQ)", returning = "returnValue")
public Object publishChangeToMQ(JoinPoint thisJoinPoint, Object returnValue) throws Throwable {

...或者您需要返回值和注释...

@AfterReturning(pointcut = "@annotation(publishMQ)", returning = "returnValue")
public Object publishChangeToMQ(JoinPoint thisJoinPoint, PublishMQ publishMQ, Object returnValue) throws Throwable {