首页 > 解决方案 > JSONObjects 不适用于 osgi 注册,不是作为函数参数,也不是作为返回

问题描述

我正在使用 knopflerfish 环境,我正在尝试使用 ServiceRegistration 使用远程对象中的函数。我将举例说明。我创建了两个包,AB。Bundle B有一个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";
}

此类C正在B的激活器中初始化并使用 ServiceRegistration 注册,因此它可以用作捆绑包A的远程对象。 A的激活器只是获取注册的对象C以便使用它的方法,这就是问题出现的地方。可以使用远程对象,但只有使用 String 的方法才能使用 JSONObject 方法。这发生在任何人身上吗?这可能是什么解释?

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

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

提前致谢。

标签: javajsonosgiremoteobjectknopflerfish

解决方案


在评论中,提问者澄清说提供该org.codehaus.jettison.json.JSONObject类型的库已被复制/嵌入到两个包中。

嵌入可用于完全包中使用的库,但绝不可用于可能在包之间共享的类型,例如作为 API 的一部分。这是因为,在 Java 中,类型的标识是其完全限定名称定义它的类加载器的组合。因此,一个包定义的类型与另一个包定义JSONObject的类型不同JSONObject——即使它们在字节码方面相同。如果您尝试将一个实例加载到期望另一个变量的变量中,您会看到ClassCastException一条消息,格式为“JSONObject 无法转换为 JSONObject”。

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


推荐阅读