在GWT中将JavaScriptObject转换为Java对象失败
Converting JavaScriptObject to Java object fails in GWT
我正在尝试访问当前位于JavaScriptObject属性中的Java对象,但转换失败。我是这样做的:
public static native MyJavaObject getMyObject(JavaScriptObject obj) /*-{
return obj['myProp'];
}-*/;
obj.myDrop是一个由Java构造函数创建的Java对象(导出后在Javascript中可见)。当我运行上面的代码时,结果是在开发模式下出现java.lang.ClassCastException。
然而,如果你喜欢下面并访问秘密属性g,它就可以工作了!gwt在转换返回值时似乎没有删除包装器。
public static native MyJavaObject getMyObject(JavaScriptObject obj) /*-{
return obj['myProp'].g;
}-*/;
上面的代码有效,但它不是一个解决方案,因为它使用了gwt中的实现细节。我做错了什么?
谢谢Johan
测试发现的一些新结论:
问题似乎取决于gwt导出器导出的对象没有像我在本机代码中预期的那样转换。
- 导出的对象被包装,原始对象存储在名为g的属性中
- 由于GWT不知道这一点,它无法从包装的导出对象中检索原始对象
- 当通过导出的接口时,包装和展开是自动的
- 这种情况的例外似乎是在本机方法中执行处理导出对象的代码时。本机方法的行为与定义为javascript的代码不同,因为它们似乎不处理导出展开。这是通过尝试调用以导出对象为参数的导出方法发现的。它在本机代码中失败了,但在普通javascript中也成功了
了解gwt exporter中实现细节的人能证实我的假设吗?
现在我找到了一种方法。我的结论是,本机代码和普通JavaScript被区别对待,这取决于导出的类不在当前范围内,需要用$wnd
进行预处理。
以下是我如何将JavaScriptObject
转换为导出的类Icon
。这有点尴尬,但它可以工作,并且不取决于实现细节。
public class ConvertUtils implements Exportable {
private static Icon icon_;
public static Icon icon(JavaScriptObject obj) {
icon_ = null;
setIconNative(obj);
return icon_;
}
private static native void setIconNative(JavaScriptObject obj) /*-{
$wnd.ravegeo.ConvertUtils.setIcon(obj);
}-*/;
@Export
public static void setIcon(Icon icon) {
icon_ = icon;
}
}
诀窍是通过导出的方法(setIcon方法)将对象转移到展开的位置。
相关文章:
- 是否可以在javascript中反序列化java对象
- 通过GWT JSNI传递Java对象时出错
- 在JSON.parse Javascript中字符串化Java对象抛出错误
- 将Java对象转换为JSON
- 当我将 Java 对象传递给客户端时,我得到“406 不可接受”
- 使用 JQuery 创建 Java 对象
- 在Javascript函数中获取Java对象属性
- JavaFX+Javascript:如何将Java对象注入AMD模块
- 如何在客户端通过多个字段对java对象进行排序
- 如何在 JavaScript 中访问作为 AJAX 请求中的响应发送的自定义 Java 对象
- 在 JQuery 中读取 Java 对象
- 为什么我的 javascript 数组从 java 对象中获取未定义的值
- Java 对象到 JSON,使用 javascript 解析
- 使用 GWT 将双精度 JS 数组(可能包含空条目)集成到 Java 对象的适当方法
- Nashorn:在 Typescript 中导入 Java 对象
- 拦截 Rhino 中 java 对象的字段访问
- Spring:在服务器和客户端之间传递数据(Java对象到JS对象)
- 如何通过Play转换Java对象以使用jqplot!2.0.
- 在javascript中使用java对象时出现非法访问异常
- 访问Java对象's具有字符串名称的成员变量