GWT-Jackson-APT在$ wnd.window JSON网络工作者代码上失败,无法对字符串进行编码

时间:2019-02-12 04:58:39

标签: gwt web-worker gwt-jackson-apt

最后使 GWT-Jackson-APT 处理器正常工作并为我的班级正确生成代码,我剩下的唯一障碍是由于某种原因gwt-jackson-apt使用了窗口JSON 字符串化(和解析)功能。

$wnd.window.JSON.stringify(STRING)

问题在于,由于存在于Web工作者上,因此未定义$ wnd.window。即使在Web-Worker中提供了 JSON.stringify() ,结果仍然是代码无法正确运行,即使我将其修改为< strong> JSON.stringify() 才能正常上传。

是否有一种干净的方法来重新定义在此实例中使用以下哪个函数?

解决此问题的最佳方法是什么,以使我的Web工作者代码不会尝试调用在其上下文中不可用的函数。

1 个答案:

答案 0 :(得分:3)

该库现在使用JSON Global.JSON.stringify的elemental2版本

,如果我们在Global类中查看JSON的实现,我们会发现它是在这里分配给window实例的:

@JsType(isNative = true, name = "window", namespace = JsPackage.GLOBAL)
public class Global {
  public static JSONType JSON;
}

当在编译时将其用作GWT Java代码中的Global.JSON.stringify(someJsonObject)时,它将产生$wnd.window.JSON.stringify(someJsonObject)或类似的内容。

为了解决此问题,我们需要以不将其链接到当前窗口实例的另一种方式访问​​本机JSON。

一种解决方案是使用JsInterop直接与JSON交互,例如

@JsType(isNative = true, namespace = JsPackage.GLOBAL)
public class JSON {
    public native static String stringify(Object jsonObj);
}

通过此实现,我们可以使用不带窗口前缀的JSON,并且当我们像这样JSON.stringify(someJsonObject)在Java中使用它时,请注意我们如何不再使用Global中的JSON,最后生成一个看起来像这样的$wnd.JSON.stringify(someJsonObject)

我运行了一个小型测试,并在jackson-apt库中实现了该JSON,并切换为使用新的实现,而不是使用Global.JSON,并且所有测试都通过了。

对我来说,这似乎是一个需要在项目存储库中报告的好问题。我将尽快应用此修复程序。