在GWT中将JavaScriptObject转换为Java对象失败

时间:2012-02-29 16:54:31

标签: java javascript gwt

我正在尝试访问当前位于JavaScriptObject属性中但转换失败的Java对象。这是我的工作:

public static native MyJavaObject getMyObject(JavaScriptObject obj) /*-{
  return obj['myProp'];
}-*/;

obj.myProp是一个Java对象,由Java构造函数创建(在导出后在Javascript中可见)。我运行上面的代码时的结果是在开发模式下的java.lang.ClassCastException。

然而,如果喜欢下面并访问秘密属性g它的工作原理!似乎gwt在转换返回值时不会删除包装器。

public static native MyJavaObject getMyObject(JavaScriptObject obj) /*-{
  return obj['myProp'].g;
}-*/;

上面的代码有效,但它不是解决方案,因为它使用gwt中的实现细节。我做错了什么?

谢谢/约翰

通过测试发现了一些新的结论:

似乎问题依赖于gwt-exporter导出的对象未按照我在本机代码中的预期进行转换。

  • 导出的对象被包装,原始对象存储在名为g。
  • 的属性中
  • 由于GWT不知道这一点,因此无法从包装的导出对象中检索原始对象。
  • 当浏览导出的接口时,自动换行和解包。
  • 这种情况的例外似乎是在本机方法中执行处理导出对象的代码时。本机方法的行为与定义为javascript的代码的行为不同,因为它们似乎不处理导出解包。通过尝试使用导出的对象作为参数调用导出的方法来找到它。它从本机代码失败了,但是从普通的javascript中做了同样的工作。

知道gwt-exporter中实现细节的人是否可以确认我的假设?

1 个答案:

答案 0 :(得分:1)

现在我找到了一种方法。我对本机代码和普通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方法)。