今天有個同事在測試環境發現一個問題,在調用dubbo的一個服務報錯,查看日誌發現,是在多線程裏面的業務邏輯中,調用dubbo的其他模塊的服務報空指針錯誤,查看代碼後沒發現什麼問題,於是,就本地啓動dubbo環境進行調試,調試過程發現在A模塊中的一個服務類ConfigService中調用其他模塊B中的一個服務類commonService的方法dealParameters,調用不到,這讓我百思不得期解,再仔細看了下模塊B中commonService類的代碼,發現在類commonService中存在兩個方法名相同,但是入參不同的方法,我想了下,是不是因爲這個,我改了下我調用的那個方法的名稱,重新啓動環境進行調試,結果發現不報錯了,爲了弄清楚爲什麼報錯,我又在commonService類中寫了兩個方法名相同但是參數不同的方法,在ConfigService中調用,結果發現不報錯,仔細對比了差異,發現上面調用dealParameters方法時,入參中傳入了一個空的參數,改爲有值後,不報錯。後面又試了同一個模塊中調用其他服務類中存在相同方法名不同參數的方法,不報錯。
由此得出了在使用dubbo中,兩個模塊之間調用服務,如果一個服務類中存在相同方法名不同入參時,調用方不能傳入null參數,否則會報空指針。
代碼如下:
模塊B的接口類和服務類,在配置文件中暴露此服務
public interface ICommonService{
String dealParameters(String a,String b);
String dealParameters(String a,String b,String c,String d);
}
public Class commonService implements ICommonService{
public String dealParameters(String a,String b){
.....
}
public String dealParameters(String a,String b,String c,String d){
.........
}
}
模塊A的服務類,在配置文件中,引入模塊B中暴露的服務ICommonService:
public Class ConfigService{
@Inject
private ICommonService commonService;
public String test(){
String a="1";
String b="2";
String c="3";
String d="4";
//入參中存在空,會報空指針異常
String result = commonService.dealParameters(a,b,c,null);
//這樣不會報錯
String result = commonService.dealParameters(a,b,c,d);
}
}