Сбой GWT-Jackson-APT в коде веб-работника JSON $ wnd.window для кодирования строк - PullRequest
0 голосов
/ 12 февраля 2019

Наконец-то, получив процессоры GWT-Jackson-APT , работающие и правильно генерирующие код для моих классов, у меня остаётся только одна ошибка: по какой-то причине gwt-jackson-apt использует окно JSON функция stringify (& parse).

$wnd.window.JSON.stringify(STRING)

Проблема в том, что из-за того, что он находится на веб-сервере, $ wnd.window не определен.Несмотря на то, что JSON.stringify () доступен в веб-приложении, в результате код не будет работать правильно, даже если я изменю его на JSON.stringify () перед загрузкой работает безупречно.

Есть ли чистый способ переопределить, какая из этих функций используется в этом случае?

Как лучше всего исправить это, чтобы мой код веб-работника не пытался вызывать функции, которые не доступны в их контексте.

1 Ответ

0 голосов
/ 12 февраля 2019

В настоящее время библиотека использует элементную версию JSON Global.JSON.stringify

, и если мы посмотрим на реализацию JSON в классе Global, то обнаружим, что он назначен экземпляру окна здесь:

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

, когда это используется как Global.JSON.stringify(someJsonObject) из Java-кода GWT, при компиляции он выдаст $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 без префикса окна, и когда мы используем его в java, как это JSON.stringify(someJsonObject), и заметим, что мы больше не используем тот из Global, мы получим сгенерированный J, который выглядит так: $wnd.JSON.stringify(someJsonObject)

Я запустил небольшой тест и внедрил этот JSON в библиотеку jackson-apt и переключился на использование новой реализации вместо использования Global.JSON и всех тестов.sed.

для меня это выглядит как хорошая проблема, о которой нужно сообщить в репозитории проекта.и я приму исправление как можно скорее.

...