最后使 GWT-Jackson-APT 处理器正常工作并为我的班级正确生成代码,我剩下的唯一障碍是由于某种原因gwt-jackson-apt使用了窗口JSON 字符串化(和解析)功能。
$wnd.window.JSON.stringify(STRING)
问题在于,由于存在于Web工作者上,因此未定义$ wnd.window。即使在Web-Worker中提供了 JSON.stringify() ,结果仍然是代码无法正确运行,即使我将其修改为< strong> JSON.stringify() 才能正常上传。
是否有一种干净的方法来重新定义在此实例中使用以下哪个函数?
解决此问题的最佳方法是什么,以使我的Web工作者代码不会尝试调用在其上下文中不可用的函数。
答案 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
,并且所有测试都通过了。
对我来说,这似乎是一个需要在项目存储库中报告的好问题。我将尽快应用此修复程序。