問題分析
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) {
//...
}
}