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 знает, что может потребоваться возможность сериализации этого класса, поэтому он сгенерирует все необходимые вещи для этого класса.