Обновление нескольких объектов с помощью RequestFactory

#java #gwt #requestfactory

#java #gwt #requestfactory

Вопрос:

У меня есть приложения GWT, которые содержат продукты и экспертов, и у одного продукта может быть несколько экспертов (отношение OneToMany). У меня возникли некоторые проблемы с микшированием и объединением запросов с использованием двух связанных объектов:

ProductProxy выглядит следующим образом:

 @ProxyFor(myapplication.server.domain.Product.class)
public interface ProductProxy extends EntityProxy {

    Long getId();

    public String getName();
    public void setName(String name);

    [...]

    EntityProxyId<ProductProxy> stableId();

    Set<ExpertProxy> getExperts();
}
  

У меня есть диалоговое окно, которое может редактировать продукт, поэтому оно выполняет:

 ProductProxy selectedProduct; // This comes from a function that delivered all products
productRequest = MyAplication.getRequestFactory().productRequest();
this.product = productRequest.edit(selectedProduct);
  

При редактировании продукта вы также можете добавить экспертов в этот продукт:

 @ProxyFor(myapplication.server.domain.Expert.class)

public interface ExpertProxy extends EntityProxy {
    public Long getId();
    public void setId(Long id);

    public ProductProxy getProduct();
    public void setProduct(ProductProxy product);
    [...]
}
  

У меня есть отдельное диалоговое окно, которое появляется для этого. Внутри этого диалогового окна я пытаюсь создать эксперта с продуктом, который редактируется перед передачей в качестве параметра:

 expertRequest = MyApplication.getRequestFactory().expertRequest();
ExpertProxy expert = expertRequest.create(ExpertProxy.class);
expert.setProduct(product); // product comes from the productRequest code
  

Если я попробую это сделать, я получу сообщение об ошибке при выполнении setProduct, потому что запрос от productRequest смешивается с запросом от expertRequest.

Каков наилучший способ исправить это? Могу ли я добавить эксперта с помощью исходного productRequest? Должен ли я получить идентификатор из продукта и использовать его только в своем экспертном запросе? Или я должен добавить определенные серверные функции, чтобы добавить эксперта в продукт? Или есть лучшие варианты?

Ответ №1:

Да, вы должны использовать один и тот же RequestContext экземпляр для всех ваших правок / созданий.

Каждый RequestContext из них накапливает операции (новые прокси и сеттеры, вызываемые на прокси) и вызовы (вызовы методов обслуживания) для воспроизведения на сервере. Все это отправляется в виде пакета, когда вы fire() . Таким образом, ваш ExpoertProxy должен быть создан из того же RequestContext , к ProductProxy которому вы его добавляете.

Комментарии:

1. Итак, я должен сохранить результат из MyAplication.getRequestFactory() и сохранить его для генерации как productRequest(), так и expertRequest() ?

2. О, извините, я не заметил, что у вас два RequestContext интерфейса. В этом случае перейдите append() expertRequest() к существующему productRequest() перед вами create() ExpertProxy . Таким образом, вы можете добавлять столько expoertRequest() экземпляров, сколько необходимо, поэтому вам не нужно сохранять ссылку на expertRequest() . Кстати, ваш RequestFactory экземпляр, вероятно, должен быть одноэлементным.

3. О, на самом деле, нет; вы не вызываете какой-либо метод обслуживания на expertRequest() , поэтому он вам не нужен: просто create(ExpertProxy.class) на productRequest() вашем главном экране .

4. merci beaucoup! Комментарий к использованию create(ExpertProxy.class ) на оригинальном productRequest() сначала выглядел нелогично, но это именно то, что мне было нужно. Итак, этот комментарий является реальным ответом.