シナリオ: JavaFX WebView/WebEngine 内で GWT Web アプリケーションを実行しています。問題なく、GWT から JavaScript、JavaFX に文字列を渡すことができます。
問題: Data[] のようなカスタム オブジェクトの配列を同じ方法で渡すと、JavaFX 側の結果が null になります。
データがどのように見えるかの例:
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 などを精査してきました。しかし、ほとんどすべての例は、1 つの引数が渡されていることを示しているだけで、Java 配列が使用されていることを示している例はほとんどありません。
to->from JSON ではなく、単にオブジェクトを通過させたいのですが、必死になって試してみました。GSON を使用しようとしましたが、GWT クライアント側では機能しません。GWT AutoBean Framework を使用しようとしましたが、Data オブジェクトは有効な Bean ではなく (デフォルトのコンストラクターがないためだと思います)、現時点では変更できません。
Long または long 値は使用していません。
次のような例を見てきました。
@com.google.gwt.examples.JSNIExample::staticFoo(Ljava/lang/String;)(s);
しかし、私が言えることは、JSNI を介して JavaScript から GWT に移行するためだけのものです。私は別の道に行こうとしています。複数の引数の例も見つかりませんでした。
私が見逃している微調整がここにあると確信していますが、まだそれを理解できていません。ここで私が見逃しているものを見つけたら教えてください。