场景:我有一个在 JavaFX WebView/WebEngine 中运行的 GWT Web 应用程序。我能够毫无问题地将字符串从 GWT 传递到 JavaScript 再到 JavaFX。
问题:当以相同方式传递自定义对象数组(如 Data[])时,JavaFX 端的结果为空。
数据的示例:
public class Data extends Serializable
{
char[] name;
int code;
short bar;
}
这是将数据发送到 JavaScript 的代码:
public static native void doNativeStuff(String id, Data[] data) /*-{
$wnd.javaInterface.doStuff(id, data);
}-*/;
我已经在调试器中验证了传入的 Java 对象填充了数据并且看起来不错。
现在在 JavaFX 方面,我有以下代码将 javaInterface 添加到页面:
JSObject win = (JSObject) engine.executeScript("window");
win.setMember("javaInterface", new JavaInterface());
我知道这行得通,因为我将它用于仅传递字符串的其他方法,而且它们工作得很好。
public void doStuff(String id, Data[] data)
{
// Right here, id == "validId" and data == null
if (data != null)
{
... do what is needed ...
}
}
请注意,Data 对象已在两侧定义并可访问。
来自 GWT 文档:
Incoming Java type How it appears to JavaScript code
Java array opaque value that can only be passed back into Java code
我根本没有在 JavaScript 中接触它,我只是从 Java->JavaScript->Java 传递它,但最后一步似乎是失败的地方。
我花了最后几个小时搜索 Stack Overflow、Google、GWT 组、gwtproject.org 等。但大多数示例只显示了一个参数被传递,几乎没有一个显示 Java 数组被传递用过。
我宁愿只传递对象而不是从 JSON 转到->,但出于绝望,我确实尝试了一下。我尝试使用 GSON,但它在 GWT 客户端不起作用。我尝试使用 GWT AutoBean 框架,但我的数据对象不是有效的 bean(我认为是因为没有默认构造函数),此时我无法更改它。
我没有使用任何 Long 或 long 值。
我见过这样的例子:
@com.google.gwt.examples.JSNIExample::staticFoo(Ljava/lang/String;)(s);
但据我所知,这只是为了通过 JSNI 从 JavaScript 到 GWT。我正试图走另一条路。我也找不到多个参数的示例。
我确定这里只是缺少了一个小的调整,但我还没有弄清楚。如果您看到我在这里遗漏的内容,请告诉我。
最佳答案
opaque value that can only be passed back into Java code
我认为这意味着您不能将 Java 数组传递到 JavaScript 代码中。
同意jat。我曾经为类似的需求提供支持,我不得不自己序列化对象。 你可以像这样传递多个参数(参数类型只是为了举例):
private native void doJSAction(MyClass handler)/*-{
// do smth in JS
// then call external non-static method
handler.@com.myclient.helper.MyClass::doMyAction(Lcom/google/gwt/core/client/JavaScriptObject;Ljava/lang/String;Lcom/myclient/helper/MyClass;II)(jsNativeSmth, myString, handler, intA, intB);
}-*/;
其中 doMyAction
类似于以下内容:
void doMyAction(JavaScriptObject jsObject, String s, MyClass instance, int a, int b)
关于gwt - 将 Java 数组传递到 JavaScript(通过 JSNI)并返回到 Java 结果为空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19392192/