JSONObjects 不适用于 osgi 注册,不作为函数参数,也不作为 return

JSONObjects not working with osgi registration, not as function argument, neaither as return

我正在使用 knopflerfish 环境,我正在尝试使用 ServiceRegistration 使用来自远程对象的函数。我将举例说明。 我创建了两个包,AB。 Bundle B 有一个 class C ,我在其中实现了两种方法:

public void printIt(JSONObject toPrint) {
    logger.debug(toPrint);
}

public void printIt(String toPrint) {
    logger.debug(toPrint);
}

public JSONObject returnedJ() {
    return (new JSONObject());
}

public String returnedM() {
    return "hello";
}

此 class C 正在 B 的激活器中初始化并使用 ServiceRegistration 注册,因此它可以用作来自 bundle A 的远程对象。 A 的激活器只是获取注册对象 C 以便使用它的方法,这就是问题出现的地方。 可以使用远程对象,但只有使用 String 的方法有效,JSONObject 方法无效。这发生在任何人身上吗?哪个可以解释?

我已经通过调试和使用 try/catch 测试了此行为,没有显示任何错误。还不得不说,当使用 JSONObject 方法时,bundle A 被冻结并且方法中没有来自 class C 的信号。现在,我将解析从 JSONObject 到捆绑包 A 中的字符串以及从字符串到捆绑包 B 中的 JSONObjects 的对象,但这仍然让我很烦。

PD:我正在使用 org.codehaus.jettison.json.JSONObject

提前致谢。

在评论中,发问者澄清说,提供 org.codehaus.jettison.json.JSONObject 类型的库已 copied/embedded 到两个包中。

嵌入可用于完全 捆绑包中使用的库,但绝不能用于 捆绑包之间可能共享的类型,例如作为 API 的一部分。这是因为,在 Java 中,类型的身份是其完全限定名称 和定义它的类加载器 的组合。因此,一个 bundle 定义的类型 JSONObject 与另一个 bundle 定义的类型 JSONObject 不同——即使它们在字节码方面相同。如果您尝试将其中一个的实例加载到期望另一个的变量中,您会看到 ClassCastException 以及 "JSONObject cannot be cast to JSONObject".

形式的消息

解决方案是确保该库仅在一个包中存在和导出,并由使用它的所有其他包导入。