繁体   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