[apache/dubbo]conflict between @Service and @transactional 还需要其他设置?

2024-07-31 727 views
4

hi: 我在 dubbo the version 2.5.4-SNAPSHOT master 分支看到提交号为 3945b83956debcf2127606ef6d88a6d29a080094 已经解决了@Service and @transactional冲突问题. 但我在使用的时候,provider生成到SpringProxy这个类命名的地址下,我使用的是spring boot 1.5.2.RELEASE. 下面是我的代码,是否还需要设置其他配置:

@Service(protocol = "dubbo", timeout = 20000, retries = -1)
@Transactional
public class GoodServiceImpl implements GoodService {
....
}
<dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>dubbo</artifactId>
     <version>2.5.4-SNAPSHOT</version>
    <exclusions>
            <exclusion>
                 <artifactId>spring</artifactId>
         <groupId>org.springframework</groupId>
        </exclusion>
    </exclusions>
</dependency>
  • [DUBBO] Register: dubbo://192.168.2.17:28801/org.springframework.aop.SpringProxy?.....

回答

4

我也是遇到这种情况了,我的没写@Transactional

4

@thinkhlin 你代码里可能有其他的注解,导致这个问题,比如@cachable之类的

9

@ffff121 昨天我还特意试了下,我单独使用@Service注解,没有其他注解的情况下是正常的,然后我只加上了@Transactional后就出现这个情况了。没有其他注解了。

5

@ffff121 是我自身的问题,只需要将事务管理的proxyTargetClass = true即可,即加上了这个注解就行了@EnableTransactionManagement(proxyTargetClass = true)

6

@thinkhlin 那我也试试你的方法,我觉得也是我少配置了什么东西,因为我用的是spring boot,在spring boot的application.properties里我配置了spring.aop.proxyTargetClass=true,但不起作用。按你说的,是不是@transaction需要单独配置proxyTargetClass=true,我今天试试,再更新这里

0

@thinkhlin 多谢!这几天太忙,刚抽出时间,试了一下,代码如下:

@Configuration
@EnableTransactionManagement(proxyTargetClass = true)
public class TransactionConfig {
}
@Transactional
@Service(protocol = "dubbo", timeout = 20000, retries = -1)
public class GoodServiceImpl implements GoodService {
...
}

这样就可以正常启动了。 ps:之前我在spring boot 的application.properties中设置spring.aop.proxyTargetClass=true并不起作用,我初步分析,spring.aop.proxyTargetClass=true属性是设置业务代码的方式。也许spring 的transaction并不起作用,需要额外设置参数

9

@thinkhlin 启动不报错了,但是最后服务还是注册到了 [DUBBO] Register: dubbo://192.168.2.17:28801/org.springframework.aop.SpringProxy?..... 这个类上面,依然不行 感觉好像是spring的问题 https://jira.spring.io/browse/SPR-14322

1

试了各种办法,升级了spring boot到2.0也不行。。。

1

现在暂时只能用之前的办法,将rpc层和业务层分开

7

AnnotationBean 没法注册 代理bean。

参考:代理bean 无法用@Service 注入 #614 或者自己修改:可以参考新浪的motan AnnotationBean.class

9

@mokci 多谢

4

这个其实是BeanPostProcessor的执行顺序的问题,我的做法是把dubbo sevice的代理放到了spring生命周期的refresh阶段做了。这个需要修改部分源码