У меня есть проект Springboot + Spring Cloud Streams, там у меня настроено несколько потоковых прослушивателей, и я хочу добиться того, чтобы перехватывать каждое входящее сообщение, чтобы извлечь из него заголовок и что-то сделать с его значением до сообщение действительно обработано. Для этого я создал совет 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
}
}
И следующий код слушателя весенних облачных потоков:
@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, и я хочу знать, что здесь происходит. Заранее спасибо!