首页 > 解决方案 > Spring-AOP 相关问题:JoinPointMatch 未绑定在调用中

问题描述

我有一个springboot + spring cloud streams proyect,我配置了一些流侦听器,我想要实现的是,拦截每条传入的消息,以便从中提取标头并在消息实际出现之前对其值进行处理处理。为此,我创建了一个 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 个参数,但在 org.springframework.aop.aspectj.AbstractAspectJAdvice.argBinding(AbstractAspectJAdvice.java:605) 处仅绑定 1(JoinPointMatch 未在调用中绑定)...

请问有什么帮助吗?

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

标签: javaspring-bootaopspring-aopspring-cloud-stream

解决方案


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

我建议你用@Order(1).


推荐阅读