Java Spring AOP相关问题:调用中未绑定JoinPointMatch
我有一个springboot+springcloudstreams项目,在那里我配置了一些流监听器,我想要实现的是截获每个传入消息,以便从中提取一个头,并在消息实际处理之前对其值进行处理。为此,我创建了如下AOP建议:Java Spring AOP相关问题:调用中未绑定JoinPointMatch,java,spring-boot,aop,spring-aop,spring-cloud-stream,Java,Spring Boot,Aop,Spring Aop,Spring Cloud Stream,我有一个springboot+springcloudstreams项目,在那里我配置了一些流监听器,我想要实现的是截获每个传入消息,以便从中提取一个头,并在消息实际处理之前对其值进行处理。为此,我创建了如下AOP建议: @Aspect @Component @Order(Ordered.HIGHEST_PRECEDENCE) public class StreamDyeContextPropagator { @Pointcut(value = "@annotation(listener
@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
}
}
@方面
@组成部分
@顺序(有序。最高优先级)
公共类StreamDyeContextPropagator{
@切入点(value=“@annotation(listener)&&execution(*com.mycompany.subpackage..*(org.springframework.messaging.Message+)&&args(Message)”,argNames=“listener,Message”)
public void streamListener(streamListener侦听器,消息){
}
@大约(value=“streamListener(listener,message)”,argNames=“pjp,listener,message”)
公共对象retrieveDye(最终处理连接点pjp、StreamListener侦听器、消息消息)抛出Throwable{
//这里有些逻辑
}
}
下面是spring cloud streams侦听器代码:
@EnableBinding(ExchangeRateSink.class)
public class ExchangeRateFromStreamListener {
@Loggable
@StreamListener(ExchangeRateSink.NEWEXCHANGERATE)
public void handle(Message<NewExchangeRateMessage> message) {
// Some logic here
}
@EnableBinding(ExchangeRateSink.class)
公共类ExchangeFromStreamListener{
@可通行
@StreamListener(ExchangeRateSink.NEWEXCHANGERATE)
公共无效句柄(消息){
//这里有些逻辑
}
但当我运行该项目时,会出现如下异常:
@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
}
}
原因:java.lang.IllegalStateException:绑定3需要
参数,但仅绑定1(未在中绑定JoinPointMatch)
调用)在
org.springframework.aop.aspectj.AbstractAspectJAdvice.argBinding(AbstractAspectJAdvice.java:605)
需要帮忙吗
PS:我知道我可以使用
@GlobalChannelInterceptor
来做类似的事情,但我想通过AOP来做,我想知道这里发生了什么。提前感谢!我测试并发现你不能使用@Order(Ordered.HIGHEST\u priority)
,用于排序。最高优先级通常用于启动初始化
我建议您将其替换为订单(1)。不清楚这是否是您的问题,但这是我的问题,这个问题是第一个谷歌结果,因此我将此作为答案发布在这里 除了用@Around注释的方法外,您似乎无法从任何地方调用
proceedingJoinPoint.procedure()
。您无法从lambda调用它。您无法将它传递给另一个类中的方法
我还没有测试,但您甚至可能无法将其传递给同一类中的另一个方法。您不需要在
@abround
注释中指定切入点吗?嗯,@StreamListener本身会产生一个代理,因此如果没有深入到杂草中,它就无法工作。@GlobalChannelInterceptor
是自然的选择以及spring cloud stream(SCSt)上下文中的推荐解决方案。我不确定@StreamListener产生代理是否会阻止它运行,因为我有一个不同的方面来执行日志记录,它作用于同一个方法。通过不同的方面来执行日志记录的要点是,正如我刚才所说,另一个方面是负责日志记录(也包括HTTP请求),我需要此功能从传入消息中提取一个“请求唯一ID”,并将其添加到MDC以使其出现在每个日志跟踪中。这样,如果我们通过通道拦截器添加它,它们将按什么顺序执行?我无法指定。