gpt4 book ai didi

java - felix 上的 OSGI 类转换异常

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:41:30 25 4
gpt4 key购买 nike

我是 osgi 的新手,正在尝试一起获得概念的功能证明。

设置是我的通用 api 在一个创造性地命名为 common-api.jar 的包中创建,没有包激活器,但它导出它的所有接口(interface)。在这种情况下感兴趣的是 DatabaseService.java。

然后我有一个名为 systemx-database-service 的第二个包。实现数据库服务接口(interface)。这在我测试与数据库的连接并选择一些任意值的实现包的激活器中工作正常。我还注册了我希望其他 bundle 可用的服务,如下所示:

   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

这太疯狂了,因为实现清楚地实现了接口(interface)!

如有任何帮助,我们将不胜感激。请记住,我对 osgi 的思维方式非常陌生,所以我的整个方法可能存在缺陷。

哦。如果有人想要 list ,我可以发布。我正在使用 maven-bnd-plugin 在 felix 上构建和执行。

谢谢

妮可

最佳答案

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

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

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

关于java - felix 上的 OSGI 类转换异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2730009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com