JSONObjects 不适用于 osgi 注册,不作为函数参数,也不作为 return
JSONObjects not working with osgi registration, not as function argument, neaither as return
我正在使用 knopflerfish 环境,我正在尝试使用 ServiceRegistration 使用来自远程对象的函数。我将举例说明。
我创建了两个包,A 和 B。 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".
形式的消息
解决方案是确保该库仅在一个包中存在和导出,并由使用它的所有其他包导入。
我正在使用 knopflerfish 环境,我正在尝试使用 ServiceRegistration 使用来自远程对象的函数。我将举例说明。 我创建了两个包,A 和 B。 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".
解决方案是确保该库仅在一个包中存在和导出,并由使用它的所有其他包导入。