解決Dubbo由於@Transactional發佈服務失敗的問題

問題分析

Dubbo在發佈服務時採用包掃描機制,對@Service註解標識的Service類發佈爲服務。
如果在服務提供者類上加入@Transactional事務控制註解後則發佈服務失敗,通過分析得知@Transactional爲服務提供者類創建代理對象,默認使用JDK動態代理方式,使用jdk代理的完整類名爲com.sun.proxy.$Proxy,而Dubbo是要掃描具體的包,掃描包的路徑無法匹配 com.sun.proxy路徑,導致服務發佈失敗。

解決方法

(1)修改事務控制採用cglib代理方式
修改:

<tx:annotation-driven transaction-manager="transactionManager" />

爲:
指定proxy-target-class屬性爲true,使用cglib代理方式

<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

(2)修改XXXServiceImpl類,在Service註解中加入interfaceClass屬性,指定服務的接口類型

@Service(interfaceClass = XXXService.class)
@Transactional
public class XXXServiceImpl implements XXXService {
    public String sayXXX(String name) {
       //...
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章