java - 如何在 GWT JSNI 中将返回值从 javascript 转换为 java?
问题描述
JSNI 方法不接受任何参数,但返回一个 Java Object 类型:
public static native String nativeJSFuncGwt() /*-{
$wnd.console.log($wnd.someJSFunc());
return "" + $wnd.someJSFunc() + "" ;
}-*/;
//someJSFunc returns { abc:xcv, def:asd}
我可以看到在 javascript 控制台中打印的值,但 java 端无法理解转换。
是因为本机方法不接受任何参数吗?
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();
第二步,定义一个符合预期JS返回值的Java类型。这将适用于 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);
推荐阅读
- database - 如何维护数据库池连接
- matlab - win x64 上的 GStreamer“SimpleMovieDemo”错误
- django - Django - 通过字段过滤相关对象
- python - Django 向另一个 webapp 发出许多 post 请求总是被取消
- python - 如何处理在熊猫中合并大型 csv 文件?
- jquery - 在输入上启动时间选择器时更改事件触发
- c - 为什么我没有收到任何错误?在这几行之间--- typedef int floa[1]; 浮动 a[5]={5,6,1,2,6,8};
- button - 如何在 SwiftUI 中使按钮组的宽度相同
- iis - Windows Server 2016 中的错误水晶报告运行时
- youtube-dl - youtube-dl:通过忽略 archive.txt 中指定的视频,将 youtube 视频 info.json 下载到播放列表中