Изменения состояния результата GWT после отправки - PullRequest
0 голосов
/ 21 сентября 2018

Логический флаг элемента данных не будет сохранять свое состояние при возврате элемента с сервера через диспетчера в Presenter (на стороне клиента).

общий пакет

 public class ResourceItem extends BaseResourceItem implements IsSerializable {

  private String name;

  public ResourceItem() {
    super();
  }

  public ResourceItem(String name) {
    super(true);
    this.name = name;
  } 
}

public class BaseResourceItem {

  private boolean removeEnabled = true;

  public BaseResourceItem() {
    super();
  }

  public BaseResourceItem(boolean removeEnabled) {
    super();
    this.removeEnabled = removeEnabled;
  }

  public boolean isRemoveEnabled() {
    return removeEnabled;
  }

  public void setRemoveEnabled(boolean removeEnabled) {
    this.removeEnabled = removeEnabled;
  }
}

Указанный флаг является removeEnabled.По умолчанию это true, и хотя я установил его на false на стороне сервера, когда Presenter его получит, по какой-то причине он был установлен на false.Я что-то упустил с сериализацией?(не могу думать ни о чем другом на данный момент).

Серверный пакет

@GenDispatch
public class GetModelSettings {

    @Out(1)
    List<ResourceItem> listOfSettings;
}

public class GetModelSettingsHandler implements ActionHandler<GetModelSettingsAction, GetModelSettingsResult> {

        @Override
        public GetModelSettingsResult execute(GetModelSettingsAction action, ExecutionContext context)
                throws ActionException {

            ResourceItem item1 = new ResourceItem();
            ResourceItem item2 = new ResourceItem();
            item2.setRemoveEnabled(false);

            list.add(item1);
            list.add(item2);

            // item1 -> true
            // item2 -> false

            return new GetModelSettingsResult(list);
        }
    }

Как видите, простой обработчик возвращает список.На этом этапе данные верны, для одного элемента установлен флаг true, для другого - false.

Клиентский пакет

public class ModelSettingsPresenter {

    dispatcher.execute(new GetModelSettingsAction(), new AsyncCallback<GetModelSettingsResult>() {

        @Override
        public void onSuccess(GetModelSettingsResult result) {
            itemList = result.getListOfSettings(); 
            // itemList.get(0) -> true
            // itemList.get(1) -> true
        }
    });
}

Оба элемента данных имеют флагиустановите в этом презентере значение true.Есть идеи, почему это происходит?

1 Ответ

0 голосов
/ 24 сентября 2018

Это связано с сериализацией, используемой с наследованием.

Во время десериализации поля несериализуемых классов будут инициализированы с использованием открытого или защищенного конструктора no-arg класса.Конструктор без аргументов должен быть доступен для подкласса, который сериализуем.Поля сериализуемых подклассов будут восстановлены из потока.

Подробнее об этом можно узнать в другом потоке Сериализация и наследование Java-объекта

...