与Spring-AOP相关的问题:JoinPointMatch在调用中未绑定

时间:2019-01-17 13:17:35

标签: java spring-boot aop spring-aop spring-cloud-stream

我有一个springboot + spring cloud流项目,我配置了一些流侦听器,我想要实现的是拦截每个传入的消息,以便从中提取头并在其之前对它的值进行处理消息实际上已处理。为此,我创建了如下的AOP建议:

@Aspect
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class StreamDyeContextPropagator {

    @Pointcut(value = "@annotation(listener) && execution(* com.mycompany.subpackage..*(org.springframework.messaging.Message+)) && args(message)", argNames = "listener, message")
    public void streamListener(StreamListener listener, Message<?> message) {
    }

    @Around(value = "streamListener(listener, message)", argNames = "pjp, listener, message")
    public Object retrieveDye(final ProceedingJoinPoint pjp, StreamListener listener, Message<?> message) throws Throwable {
        // Some logic here
    }
}

以下是Spring Cloud Streams侦听器代码:

@EnableBinding(ExchangeRateSink.class)
public class ExchangeRateFromStreamListener {

    @Loggable
    @StreamListener(ExchangeRateSink.NEWEXCHANGERATE)
    public void handle(Message<NewExchangeRateMessage> message) {
        // Some logic here
    }

但是当我运行项目时,出现如下异常:

  

原因:java.lang.IllegalStateException:绑定3必需   参数,但仅绑定1(JoinPointMatch未绑定   调用)   org.springframework.aop.aspectj.AbstractAspectJAdvice.argBinding(AbstractAspectJAdvice.java:605)   ...

请帮忙吗?

PS:我知道我可以使用@GlobalChannelInterceptor做类似的事情,但是我想通过AOP来做,我想知道这里发生了什么。预先感谢!

2 个答案:

答案 0 :(得分:0)

我测试发现您不能使用@Order(Ordered.HIGHEST_PRECEDENCE),因为Ordered.HIGHEST_PRECEDENCE通常用于启动初始化。

我建议您将其替换为@Order(1).

答案 1 :(得分:0)

不清楚这是否是您的问题,但这是我的问题,这个问题是第一个谷歌结果,所以我在这里发布这个作为答案。

除了用@Around 注释的方法外,您似乎无法从任何地方调用 proceedingJoinPoint.proceed()。您不能从 lambda 调用它。您不能将其传递给另一个类中的方法。

我还没有测试过,但你甚至可能无法将它传递给同一个类中的另一个方法。