Как отредактировать значение ValueProxy фабрики запроса gwt на стороне клиента?

У меня 2 модели: ContactGroup и Contact. ContactGroup содержит много контактов.

На странице я должен отобразить список групп и количество контактов в группе корреспонденции следующим образом:

  • Group Foo (12 контактов)
  • Групповая панель (20 контактов)

Итак, на стороне сервера я использовал DTO ContactGroupInfo:

public class ContactGroupInfo {
    private Integer contactCount;
    private Long id;
    private String name;

    public Integer getContactCount() { return this.contactCount; }
    public Long getId() { return this.id; }
    public String getName() { return this.name; }
    public void setContactCount(Integer count) { this.contactCount = count; }
    public void setId(Long id) { this.id = id; }
    public void setName(String name) { this.name = name; }
}

В этом ContactGroupInfo я добавил поле contactCount, которое не является полем в объекте ContactGroup.

А на стороне клиента я использовал ValueProxy:

@ProxyFor(value = ContactGroupInfo.class, locator = ContactGroupService.class)
public interface LightContactGroupProxy extends ValueProxy {
    Integer getContactCount();
    Long getId();
    String getName();
    void setContactCount(Integer count);
    void setId(Long id);
    void setName(String name);
}

Поэтому, когда серверная сторона возвращает клиентской стороне список LightContactGroupProxy, я сохранил этот список в ArrayList для рендеринга в CellTable.

И вот ко мне приходит проблема: когда мне нужно отредактировать имя группы на стороне клиента, я не могу напрямую редактировать объект LightContactGroupProxy.

  • Поэтому мне нужно отправить новое имя на сервер, чтобы вернуть новый LightContactGroupProxy с новым именем. Это неэффективно, потому что мне приходится снова пересчитывать контакты (хотя я знаю, что количество контактов не меняется).
  • Или мне нужно отправить на сервер количество контактов и новое имя, чтобы создать новый LightContactGroupProxy с новым именем. Я не хочу этого, потому что, если LightContactGroupProxy имеет много других полей, мне нужно отправить много полей.

Я не знаю, почему команды GWT разрабатывают неизменяемый прокси. Итак, пожалуйста, у кого-то есть опыт работы с requestfactory, покажите мне правильный способ обработки ValueProxy, возвращаемого с сервера, чтобы мы могли использовать их для рендеринга и редактирования?

Спасибо


person Bang    schedule 17.09.2011    source источник


Ответы (1)


Может, стоит попробовать что-то вроде этого:

ContactGroupContext ctx = requestFactory.newContactGroupContext();
LightContactGroupProxy editableProxy = ctx.edit(lightContactGroupProxy);
editableProxy.setName(newName);
ctx.saveInfoAndReturn(editableProxy).fire(receiver); // or just ctx.fire();

В любом случае, я бы не стал использовать ValueProxy в этом случае, я бы напрямую получил ContactGroup сущности с переходным свойством contactCount. Свойство может быть примитивным или ValueProxy, если вы не хотите, чтобы оно вычислялось каждый раз, когда запрашивается ContactGroup.

person Mikael Couzic    schedule 17.09.2011
comment
Я не могу использовать ctx.edit (lightContactGroupProxy) или использовать LightContactGroupProxy в качестве параметра метода, потому что я добавил к нему поле contactCount. Это поле не существует объекта ContactGroup. Таким образом, сервер всегда будет генерировать исключение. Не удалось найти сеттер для свойства contactCount в типе ContractGroup в ReflectiveServiceLayer.setProperty () - person Bang; 17.09.2011
comment
Это исключение будет выдано при попытке установить contactCount для ContactGroup. Вы хотите установить contactCount в ContactGroupInfo. У вас может быть проблема с аннотацией @ProxyFor на LightContactGroupProxy. Убедитесь, что у вас есть value = ContactGroupInfo.class, и отбросьте локатор, он вам не нужен для ValueProxy. - person Mikael Couzic; 17.09.2011
comment
Спасибо, Микаэль. Я пытаюсь снова и вижу, что могу использовать ValueProxy в качестве параметра метода. Я проверил историю своего кода и вижу, что установил неправильное значение для @ProxyFor (для ContactGroup.class). Поэтому я думаю, что буду использовать редактируемый ValueProxy в качестве параметра метода RequestFactory, и сервер отредактирует и вернет отредактированный ValueProxy клиенту. - person Bang; 18.09.2011