问题分析
spring在处理@Transactional注释的类时,会有jdk动态代理和cglib动态代理两种方式生成代理类。jdk动态代理生成的代理类会实现与被代理类相同的接口,间接调用被代理类。cglib生成的代理类,为被代理类的子类,可以继承代理类的注解,但是dubbo的@Service注解没有@Inherited,所以代理类没有@Service注解,无法发布出去。
解决方法
1.避开在Dubbo服务里使用事务,在非Dubbo服务类里使用@Transactional,然后在Dubbo服务中调用。
2.使用dubbo2.6.0以上版本,@dubbo必须显示声明interfaceClass,配置spring.aop.proxy-target-class=true