java - 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来做,我想知道这里发生了什么。提前致谢!
解决方案
我测试发现不能使用@Order(Ordered.HIGHEST_PRECEDENCE)
, forOrdered.HIGHEST_PRECEDENCE
通常用于启动初始化。
我建议你用@Order(1).
推荐阅读
- amazon-web-services - 写入 aws s3 存储桶时 Spark 作业失败 -
- reactjs - React 如何在材质 ui 表中固定/显示/张贴带有可见性图标(眼睛)的按钮?
- amazon-web-services - AWS 上的 Lambda 函数在 EC2 关闭之前发送通知
- java - 如何将变量传递给Java中的不同线程
- asp.net-web-api - 当 API 版本在 URL 中时,为什么 Swagger 需要版本请求参数?
- php - 无法在 Windows 中将 PHP 7.1 升级到 PHP 7.2
- javascript - ES6 模块,什么算作第一次导入?
- reactjs - 未捕获的 ReferenceError:未定义 _asyncToGenerator
- mysql - 显示用户详细信息,在他之后和之前加入的用户总数
- python - 修改后未通过 setup.py 重新安装 Cython 扩展