我有一个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来做,我想知道这里发生了什么。预先感谢!
答案 0 :(得分:0)
我测试发现您不能使用@Order(Ordered.HIGHEST_PRECEDENCE)
,因为Ordered.HIGHEST_PRECEDENCE
通常用于启动初始化。
我建议您将其替换为@Order(1).
答案 1 :(得分:0)
不清楚这是否是您的问题,但这是我的问题,这个问题是第一个谷歌结果,所以我在这里发布这个作为答案。
除了用@Around 注释的方法外,您似乎无法从任何地方调用 proceedingJoinPoint.proceed()
。您不能从 lambda 调用它。您不能将其传递给另一个类中的方法。
我还没有测试过,但你甚至可能无法将它传递给同一个类中的另一个方法。