Проблема, связанная с Spring-AOP: JoinPointMatch НЕ был связан в вызове - PullRequest
0 голосов
/ 17 января 2019

У меня есть проект 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, и я хочу знать, что здесь происходит. Заранее спасибо!

...