#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() сначала выглядел нелогично, но это именно то, что мне было нужно. Итак, этот комментарий является реальным ответом.