如何在 GWT JSNI 中将 return 值从 java 脚本转换为 java?
How to cast a return value from javascript to java in GWT JSNI?
JSNI方法不接受任何参数但是return一个Java对象类型:
public static native String nativeJSFuncGwt() /*-{
$wnd.console.log($wnd.someJSFunc());
return "" + $wnd.someJSFunc() + "" ;
}-*/;
//someJSFunc returns { abc:xcv, def:asd}
我可以在 java 脚本控制台中看到打印的值,但 java 端无法理解转换。
是不是因为native方法不接受任何参数?
String tokenFromNativeJS = nativeJSFuncGwt(); // String value is null
GWT 中的文档也不够清晰。
第一步,避免 JSNI,您最好定义一个提供相同 API 访问权限的 JsInterop 方法。 JSNI 仍将在 GWT2 中工作,但 JsInterop 是 GWT3 的前进方向,并且通常更易于读写。这看起来像这样:
@JsMethod(name = "someJSFunc", namespace = JsPackage.GLOBAL)
public static native String someJSFunc();
第二步,定义一个 Java 类型,它符合您预期的 JS return 值。这将适用于 JSNI 或 JsInterop。在 JSNI 中,您将创建一个 JavaScriptObject 子类,并提供访问字段的方法(有关更多详细信息,请参阅 http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html 和其他文档,但按照第一步,我不打算深入在这里深入了解)。对于您的示例对象,这在 JsInterop 中看起来像这样:
@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL)
public class SomeReturnObject {
public String abc;
public double def;
}
显然,将字段名称和类型替换为适合您自己项目的名称和类型。给这个新类型加上占位符名称,这是你的全局 someJsFunc 的样子:
@JsMethod(name = "someJSFunc", namespace = JsPackage.GLOBAL)
public static native SomeReturnObject someJSFunc();
并且您可以像预期的那样使用它 Java - 不再需要编写 JSNI:
SomeReturnObject object = someJSFunc();
DomGlobal.console.log(object.abc + ": " + object.def);
由于 GWT 版本 (2.4) 限制,我在这里发布了最终有效的内容
来自 GWT 文档:
Outgoing Java type:
Any other Java Object (including arrays)
What must be passed:
Java Object of the correct type that must have originated in Java
code; Java objects cannot be constructed from “thin air” in JavaScript
我修改后的代码如下:
public static native MyObject nativeJSFuncGwt(MyObject obj) /*-{
var xyz = $wnd.someJsFunc();
obj.@package.name::setter1(Ljava/lang/String;)(xyz);
return obj;
}-*/;
我希望文档能更清楚。
JSNI方法不接受任何参数但是return一个Java对象类型:
public static native String nativeJSFuncGwt() /*-{
$wnd.console.log($wnd.someJSFunc());
return "" + $wnd.someJSFunc() + "" ;
}-*/;
//someJSFunc returns { abc:xcv, def:asd}
我可以在 java 脚本控制台中看到打印的值,但 java 端无法理解转换。
是不是因为native方法不接受任何参数?
String tokenFromNativeJS = nativeJSFuncGwt(); // String value is null
GWT 中的文档也不够清晰。
第一步,避免 JSNI,您最好定义一个提供相同 API 访问权限的 JsInterop 方法。 JSNI 仍将在 GWT2 中工作,但 JsInterop 是 GWT3 的前进方向,并且通常更易于读写。这看起来像这样:
@JsMethod(name = "someJSFunc", namespace = JsPackage.GLOBAL)
public static native String someJSFunc();
第二步,定义一个 Java 类型,它符合您预期的 JS return 值。这将适用于 JSNI 或 JsInterop。在 JSNI 中,您将创建一个 JavaScriptObject 子类,并提供访问字段的方法(有关更多详细信息,请参阅 http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html 和其他文档,但按照第一步,我不打算深入在这里深入了解)。对于您的示例对象,这在 JsInterop 中看起来像这样:
@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL)
public class SomeReturnObject {
public String abc;
public double def;
}
显然,将字段名称和类型替换为适合您自己项目的名称和类型。给这个新类型加上占位符名称,这是你的全局 someJsFunc 的样子:
@JsMethod(name = "someJSFunc", namespace = JsPackage.GLOBAL)
public static native SomeReturnObject someJSFunc();
并且您可以像预期的那样使用它 Java - 不再需要编写 JSNI:
SomeReturnObject object = someJSFunc();
DomGlobal.console.log(object.abc + ": " + object.def);
由于 GWT 版本 (2.4) 限制,我在这里发布了最终有效的内容
来自 GWT 文档:
Outgoing Java type:
Any other Java Object (including arrays)
What must be passed:
Java Object of the correct type that must have originated in Java code; Java objects cannot be constructed from “thin air” in JavaScript
我修改后的代码如下:
public static native MyObject nativeJSFuncGwt(MyObject obj) /*-{
var xyz = $wnd.someJsFunc();
obj.@package.name::setter1(Ljava/lang/String;)(xyz);
return obj;
}-*/;
我希望文档能更清楚。