[英]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.