簡體   English   中英

felix上的OSGI classcast異常

[英]OSGI classcast exception on felix

我對osgi相當新,並試圖將概念的功能證明放在一起。

設置是我的公共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上構建和執行。

謝謝

尼科

測試包必須解析為與SystemDatabaseServiceImpl相同的DatabaseService接口導入。 如果沒有發生這種情況,則getServiceReference文檔即使找到服務也會返回null。 通過手動定位bundle並嘗試定位服務和強制轉換,您將顯示為什么getServiceReference以這種方式運行:如果它返回任意服務,Java強制轉換將失敗。

我建議在impl包和測試包中打印DatabaseService.class.getClassLoader()以證明它們是否是同一個包。 如果不是,那么您需要調整OSGi MANIFEST.MF元數據以確保它們具有一致的接口類視圖。

例如,testService和impl包中是否包含DatabaseService接口? 如果是,則需要將該接口移動到impl包(和Export-Package)或第三個接口包和Export-Package。 然后,將其他包調整為Import-Package。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM