2010-04-28 64 views
3

我對osgi相當陌生,並且試圖一起獲得概念的功能性證明。felix上的OSGI classcast異常

設置是我的通用api創建在名爲common-api.jar的創造性捆綁包中,沒有捆綁激活器,但它導出所有的接口。在這種情況下感興趣的是DatabaseService.java。

然後我有一個名爲systemx-database-service的第二個包。這實現了數據庫服務接口。這工作正常,因爲在執行包的激活器中,我測試到數據庫的連接並選擇一些仲裁值。我也註冊我希望對方提供捆綁的,像這樣的服務:

context.registerService(DatabaseService.class.getName(), new SystemDatabaseServiceImpl(context), new Properties()); 

的基本思想,當你看爲一個數據庫服務,你會回來的SystemDatabaseService實施服務引用之中。

當我做了檢查服務的輸出是這樣的:

-> inspect s c 69 
System Database Service (69) provides services: 
---------------------------------------------- 
objectClass = za.co.xxx.xxx.common.api.DatabaseService 
service.id = 39 

這將導致我相信,如果我這樣做的測試包:

context.getService(context.getServiceReference(DatabaseService.class)); 

我該回去了DatabaseService.class的實例,但唉,沒有這樣的運氣。它只是看起來無法找到服務。堅持在這裏我的故事變得陌生。

搞清楚有沒有地方可去,但後我寫了這個怪物:

for (Bundle bundle : bundles) { 
     if (bundle.getSymbolicName().equals("za.co.xxx.xxx.database-service")) { 
      ServiceReference[] registeredServices = bundle.getRegisteredServices(); 
      for (ServiceReference ref : registeredServices) { 
       DatabaseService service = (DatabaseService) context.getService(ref); 
       // use service here. 
       } 
      } 
     } 
    } 

現在我可以清楚地看到該服務的參考,但我得到這個錯誤

java.lang.ClassCastException: za.co.xxx.xxx.database.service.impl.SystemDatabaseServiceImpl cannot be cast to za.co.xxx.xx.common.api.DatabaseService 

這是瘋狂的,因爲執行明確實現界面!

任何幫助,將不勝感激。請記住,我對osgi的思維方式非常陌生,所以我的整個方法可能有缺陷。

哦。如果有人想要清單,我可以發佈它們。我使用maven-bnd-plugin在felix上構建和執行。

感謝

尼科

回答

2

的測試包必須解決的DatabaseService接口作爲SystemDatabaseServiceImpl的相同的導入。如果這沒有發生,那麼getServiceReference文檔即使找到服務也會返回null。通過手動查找捆綁軟件並嘗試查找服務和強制轉換,您將展示爲什麼getServiceReference具有這種行爲:如果它返回任意服務,則Java強制轉換將失敗。

我會推薦在impl bundle和test bundle中打印DatabaseService.class.getClassLoader()來證明它們是否是相同的bundle。如果它們不是,那麼你需要調整OSGi MANIFEST.MF元數據以確保它們具有接口類的一致視圖。

例如,是否包含在test和impl包中的DatabaseService接口?如果是,您需要將該接口移到impl包(和Export-Package)或第三個接口包和Export-Package。然後,將其他捆綁包調整爲Import-Package。

+1

獲得「A級不能轉換爲A類」是當多個類加載涉及一個經典的Java問題和OSGi有每捆一類加載器。 – SteveD 2010-04-28 14:15:36

+0

bkail現貨。當我在類加載器跑了系統輸出我得到 [ 69.0 =類加載器對象服務 74.0 =類加載這個類 。 common-api在單獨的包中。這是否意味着我需要將它從我爲實現和測試包創建的jar中排除? – Nico 2010-04-29 12:44:12

+0

謝謝。從一切和BAM中排除常見的api。奇蹟般有效 – Nico 2010-04-29 13:11:04

相關問題