felix上的OSGI classcast异常

时间:2010-04-28 13:50:23

标签: java osgi apache-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上构建和执行。

感谢

尼科

1 个答案:

答案 0 :(得分:2)

测试包必须解析为与SystemDatabaseServiceImpl相同的DatabaseService接口导入。如果没有发生这种情况,则getServiceReference文档即使找到服务也会返回null。通过手动定位bundle并尝试定位服务和强制转换,您将显示为什么getServiceReference以这种方式运行:如果它返回任意服务,Java强制转换将失败。

我建议在impl包和测试包中打印DatabaseService.class.getClassLoader()以证明它们是否是同一个包。如果不是,则需要调整OSGi MANIFEST.MF元数据,以确保它们具有一致的接口类视图。

例如,testService和impl包中是否包含DatabaseService接口?如果是,则需要将该接口移动到impl包(和Export-Package)或第三个接口包和Export-Package。然后,将其他包调整为Import-Package。