EXT GWT BaseModel должен иметь ссылку DTO?

Я очень новичок в GWT. Я использую виджеты ext-gwt.

Я нашел много мест в моем офисе код, содержащий как,

class A extends BaseModel{

 private UserAccountDetailsDto userAccountDetailsDto = null;

 //SETTER & GETTER IN BASEMODEL WAY
}

Кроме того, ссылка DTO не используется.

public class UserAccountDetailsDto implements Serializable{

    private Long userId=null;
    private String userName=null;
    private String userAccount=null;
    private String userPermissions=null;

        //NORMAL SETTER & GETTER
}

Теперь я могу получить результат от GWT-кода на стороне сервера и все в порядке. Но когда я комментирую ссылку на DTO внутри класса A, я не получаю никакого результата.

Пожалуйста, объясните мне необходимость этого.

Спасибо

2 ответа

Перенос кода приложения GXT2 с использованием BaseModel на модель GXT3 является сложной задачей. Было бы более или менее полностью переписано на стороне модели с ModelProviders из GXT3, обеспечивающими некоторую гибкость. Любой код, который опирается на события модели, хранилище, запись и т. Д., Подлежит переписыванию.

Ну проблема в реализации GXT BaseModel и сериализация GWT-RPC. BaseModel основана на специальной карте GXT, RpcMap. Эта карта определила специальные правила сериализации, которые позволяют избежать взрыва типа RPC, но в качестве побочного эффекта сериализуются только некоторые простые типы, хранящиеся в карте. Например, вы можете поместить любой тип внутри карты, но если вы сериализуете / десериализуете его, будут присутствовать только значения типа Integer, String,Double,Byte, Float и Short (и массивы этого типа). Таким образом, смысл, лежащий в основе ссылки на DTO внутри BaseModel, состоит в том, чтобы сказать GWT-RPC, что этот тип также должен быть сериализован.

Детальное объяснение

В основном GWT-RPC работает так:

Когда вы определяете интерфейс для сервиса, GWT-RPC анализирует все классы, используемые в параметрах / типе возврата, для создания сериализаторов / десериализаторов. Если вы вернете что-то вроде Map<Object,Object> от вашего сервиса GWT-RPC должен будет создать сериализатор для каждого класса, который реализует интерфейсы Map и Serializable, но также он будет генерировать сериализаторы для каждого класса, который реализует Serializable. В конце концов, это довольно плохая ситуация, потому что размер вашего скомпилированного js-файла будет намного большим. Эта ситуация называется взрывом типа GWT-RPC.

Итак, в BaseModelвсе значения хранятся в RpcMap, А также RpcMap имеет заказной сериализатор (RpcMap_CustomFieldSerializer вы можете увидеть его код, если вам интересно, как создавать такие вещи), поэтому он не вызывает проблемы, описанной выше. Но так как у него есть собственный сериализатор, GWT не знает, какой пользовательский класс был помещен внутрь RpcMapи он не генерирует сериализаторы для них. Поэтому, когда вы кладете какое-то поле в свой BaseModel класс, gwt знает, что может потребоваться возможность сериализации этого класса, поэтому он сгенерирует все необходимые вещи для этого класса.

Другие вопросы по тегам