Приведение массива GWT JsType

Когда у меня есть объект JSON, например:

{
    "asset": {
        "properties": [{
            "name": "xxx",
            "id": "yy"
        }]
    }
}

Затем у меня есть оболочки JsInterop, например:

@JsType
public class Asset {

   @JsProperty
   public native jsinterop.base.JsArrayLike<Property> getProperties();

}

а также:

@JsType
public class Property {

   @JsProperty
   public native String getName();
   @JsProperty
   public native String getId();
}

Когда где-то в коде я пытаюсь получить доступ к данным, происходит сбой, когда я пытаюсь получить доступ к атрибутам объекта Property.

Например:

Asset asset = dataProvider.getAssets();
console.log(assets) //works ok: => {"properties":Array(1)}
console.log(asset.getProperties()) //works ok:  => Array(1)
console.log(asset.getProperties().getAt(0)) //works ok:  => {"name":"xxx","id":"yy"}
console.log(asset.getProperties().getAt(0).getName() //does not work:  => Uncaught exception: undefined

ИЛИ, если я создам класс активов и свойств (isNative=true):

Uncaught exception: Cannot read property "company" of undefined.

Я проверил, и если я компилирую приложение, когда пытаюсь получить имя или идентификатор, код компилируется в:

castTo(asset.properties[0], 125)

ИЛИ если (isNative=true):

castToNative(asset.properties[0], $wnd.com.company.project.Property)

Сначала я подумал, что это из-за моей реализации оболочки для массива, но я обнаружил «jsinterop.base.JsArrayLike», поэтому я подумал, что это решит мою проблему, но ошибка осталась прежней. Я что-то упустил? Я бы очень хотел использовать JsInterop вместо методов JSNI и типов Overlay, но я не могу пройти мимо этих массивов.


person Zdeněk Braun    schedule 05.03.2018    source источник


Ответы (1)


Когда вы обрабатываете данные из JSON, вы получаете простые старые объекты Object и Array. Поэтому вам нужно использовать

@JsType(isNative=true, namespace=JsPackage.GLOBAL, name="Object")

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

person Thomas Broyer    schedule 06.03.2018
comment
Круто, это работает, я думал, что имя должно быть именем Java, а не то, что все должны иметь одно и то же имя объекта :) И если я использую интерфейсы, метод не будет иметь собственного ключевого слова, а аннотация может быть просто @JsType( родной=истина) ? - person Zdeněk Braun; 06.03.2018
comment
Хорошо, я попробовал это даже с интерфейсами, и это работает без нареканий, спасибо - person Zdeněk Braun; 06.03.2018