Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring AOP相关问题:调用中未绑定JoinPointMatch_Java_Spring Boot_Aop_Spring Aop_Spring Cloud Stream - Fatal编程技术网

Java Spring AOP相关问题:调用中未绑定JoinPointMatch

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

我有一个springboot+springcloudstreams项目,在那里我配置了一些流监听器,我想要实现的是截获每个传入消息,以便从中提取一个头,并在消息实际处理之前对其值进行处理。为此,我创建了如下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
    }
}
@方面
@组成部分
@顺序(有序。最高优先级)
公共类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以使其出现在每个日志跟踪中。这样,如果我们通过通道拦截器添加它,它们将按什么顺序执行?我无法指定。