Преобразование JavaScriptObject в объект Java терпит неудачу в GWT - PullRequest
1 голос
/ 29 февраля 2012

Я пытаюсь получить доступ к объекту Java, который в настоящее время находится в свойстве JavaScriptObject, но преобразование не выполнено.Вот что я делаю:

public static native MyJavaObject getMyObject(JavaScriptObject obj) /*-{
  return obj['myProp'];
}-*/;

obj.myProp - это объект Java, который создается конструктором Java (который виден в Javascript, поскольку он экспортируется).Результатом, когда я запускаю приведенный выше код, является java.lang.ClassCastException в режиме разработки.

Однако, если сделать, как показано ниже, и получить доступ к секретному свойству g, это работает!Кажется, что gwt не удаляет оболочку при преобразовании возвращаемого значения.

public static native MyJavaObject getMyObject(JavaScriptObject obj) /*-{
  return obj['myProp'].g;
}-*/;

Приведенный выше код работает, но это не решение, поскольку он использует детали реализации в gwt.Что я делаю не так?

Спасибо / Йохан

Некоторые новые выводы, найденные при тестировании:

Кажется, что проблемы зависят от объектов, экспортируемых gwt-exporter, не преобразуются какЯ ожидал в нативном коде.

  • Экспортированные объекты оборачиваются, и исходный объект сохраняется в свойстве с именем g.
  • Поскольку GWT не знает об этом, он не может получить оригиналобъект из обернутого экспортируемого объекта.
  • При прохождении через экспортированные интерфейсы перенос и развертывание выполняются автоматически.
  • Исключением из этого является, по-видимому, исключение при выполнении кода, имеющего дело с экспортированным объектом в собственных методах.Нативные методы ведут себя не так, как код, определенный как javascript, в том смысле, что они не обрабатывают развертывание экспорта.Это было найдено при попытке вызвать экспортированный метод с экспортированным объектом в качестве параметра.Это не удалось из нативного кода, но сделать то же самое из обычного javascript сработало.

Может ли кто-нибудь со знанием деталей реализации в gwt-exporter подтвердить мои предположения?

1 Ответ

1 голос
/ 01 марта 2012

Теперь я нашел способ сделать это.Мой вывод о том, что нативный код и обычный JavaScript обрабатывались по-разному, зависел от того, что экспортированные классы не были в текущей области видимости и должны были предшествовать $wnd.

Вот как я преобразовал JavaScriptObject в экспортированный класс Icon.Это немного неловко, но работает и не зависит от деталей реализации.

public class ConvertUtils implements Exportable {

    private static Icon icon_;

    public static Icon icon(JavaScriptObject obj) {
        icon_ = null;
        setIconNative(obj);
        return icon_;
    }

    private static native void setIconNative(JavaScriptObject obj) /*-{
        $wnd.ravegeo.ConvertUtils.setIcon(obj);
    }-*/;

    @Export
    public static void setIcon(Icon icon) { 
        icon_ = icon; 
    }
}

Хитрость заключается в том, чтобы передать объект через экспортированный метод, где он распаковывается (метод setIcon).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...