GWT-Jackson-APT 在用于编码字符串的 $wnd.window JSON web-worker 代码上失败

GWT-Jackson-APT fails on $wnd.window JSON web-worker code for encoding strings

终于让 GWT-Jackson-APT 处理器正常工作并为我的 类 正确生成代码,我剩下的一个小问题是由于某种原因 gwt- jackson-apt 使用 window JSON stringify (& parse) 函数。

$wnd.window.JSON.stringify(STRING)

问题是由于这是在 web-worker 上,$wnd.window 没有定义。即使 JSON.stringify() 在 web-worker 中可用,结果是代码不会 运行正确,即使我在上传之前将其修改为 JSON.stringify() 也能正常工作。

是否有一种简洁的方法来重新定义在这种情况下使用了哪些函数?

解决这个问题的最佳方法是什么,这样我的网络工作者代码就不会尝试调用在其上下文中不可用的函数。

库现在使用 JSON Global.JSON.stringify

的 elemental2 版本

如果我们查看全局 class 中 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,而不是 link 当前 window 实例。

一个解决方案是使用 JsInterop 直接与 JSON 接口,像这样

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

通过此实现,我们可以使用不带 window 前缀的 JSON,当我们像这样在 java 中使用它时 JSON.stringify(someJsonObject) 并注意我们如何不再使用来自 Global 的那个我们最终生成了一个看起来像这样的 Js $wnd.JSON.stringify(someJsonObject)

i 运行 一个小测试并在 jackson-apt lib 中实现了这个 JSON 并切换到使用新实现而不是使用 Global.JSON 并且所有测试都通过了。

对我来说,这看起来是一个值得在项目存储库中报告的好问题。我会尽快应用修复程序。