You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring AOP无法拦截JMS MessageListener的onMessage()方法,如何解决?

解决Spring AOP拦截JMS MessageListener onMessage方法不触发的问题

核心原因

  1. 你定义的切点execution( void javax.jms.MessageListener.onMessage(javax.jms.Message))仅匹配接口方法,但@LoggingInfo注解标注在实现类的重写方法上。Spring默认使用JDK动态代理(基于接口),无法识别实现类方法上的注解,导致切点匹配失败。
  2. 若未显式开启AspectJ自动代理,Spring不会主动启用AOP功能。

具体修复步骤

1. 调整切点定义

修改切点,使其匹配任意类的onMessage方法,同时结合注解条件:

@Aspect
@Component
public class LoggingAspect {
    
    // 匹配标注了@LoggingInfo的方法,替换为你实际的注解包路径
    @Pointcut("@annotation(com.your.package.LoggingInfo)")
    private void annotationPointCut() {
    }
    
    // 匹配所有返回值为void、参数为javax.jms.Message的onMessage方法
    @Pointcut("execution(void *.onMessage(javax.jms.Message))")
    private void onMessagePointCut() {
    }
    
    @AfterReturning("onMessagePointCut() && annotationPointCut()")
    public void loggingAdvice(JoinPoint jp ) {
         System.out.println("logging advice method called successfully");
    }    
}

2. 开启AspectJ自动代理

在Spring启动类(或配置类)上添加@EnableAspectJAutoProxy注解,强制使用CGLIB代理(确保能读取实现类方法上的注解):

@SpringBootApplication
@ComponentScan(basePackages = "com.your.package")
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class YourApplication {
    public static void main(String[] args) {
        SpringApplication.run(YourApplication.class, args);
    }
}

3. 验证代理状态

可以添加一段代码,确认MessageReceiver是Spring生成的代理对象:

@Autowired
private ApplicationContext context;

@PostConstruct
public void checkProxyStatus() {
    MessageReceiver receiver = context.getBean(MessageReceiver.class);
    System.out.println("Is proxy: " + AopUtils.isAopProxy(receiver));
}

输出Is proxy: true即说明代理生效。

4. 核对注解包路径

确保@annotation(...)中的包路径与LoggingInfo注解的实际包路径完全一致,避免因路径错误导致匹配失败。

关键说明

JDK动态代理仅针对接口生成代理,无法直接获取实现类方法上的注解;而CGLIB代理基于类生成,能识别实现类方法的注解,因此开启proxyTargetClass = true是解决这类问题的关键。同时调整切点范围,让它覆盖所有类的onMessage方法,才能和注解条件正确组合匹配。

内容的提问来源于stack exchange,提问作者CoderCoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 16:05:38