繁体   English   中英

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

[英]Spring-AOP related problem: JoinPointMatch was NOT bound in invocation

我有一个 springboot + spring 云流项目,在那里我配置了一些流侦听器,我想要实现的是拦截每个传入的消息,以便从中提取标头并在消息实际出现之前对其值进行处理处理。 为此,我创建了一个 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 来做,我想知道这里发生了什么。 提前致谢!

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM