背景:
以前项目使用spring集成dubbo,dubbo通过xml配置文件的方式配置服务,使用@Transactional没有问题,后来通过dubbo的@service注解简化配置,但是发现有@Transactional注解的服务不能通过dubbo的@service发布服务,消费端通过@Reference找不到服务就报错了。
问题分析:
通过百度发现在使用@Transactional时spring会为这个类生成一个代理类,这个代理类有两种生成方式。一种是jdk动态代理,一种是CGLib动态代理。
jdk动态代理生成的代理类与当前类共同实现相同的接口,所以与当前类也只是间接调用的关心,不在此次讨论范围。
CGLib生成的代理类为当前Service的子类,可以集成到当前Service的注解。
然后dubbo的@service注解中没有@Inherited(是否可以被继承),即他无法被继承所以新的代理类就相当于没有使用@service这个注解,所以无法发布服务。
问题解决:
网上很多的解决方案还是基于dubbo2.5.X,dubbo还没有解决这个问题,但是在dubbo2.6.0以上dubbo官方已经修复了这个问题,但是如果这样还是不行,还需要在application.properties中添加配置spring.aop.proxy-target-class=false