Запрос на изменение редактора Factory GWT не сохраняется связанных сущностей JDO
Я использую (и впервые использую) RequestFactory в GWT 2.5 с сущностями JDO, имеющими отношение один ко многим, в хранилище данных AppEngine. Я только начал использовать GWT RequestFactoryEditorDriver для отображения / редактирования моих объектов.
Водитель хорошо просматривает мои объекты и отображает их правильно. Тем не менее, когда я пытаюсь редактировать значение в "связанных" объектах, изменение не сохраняется в хранилище данных.
Когда я меняюсь b.name
на моем интерфейсе и нажмите "Сохранить", я замечаю только А persist()
вызов называется. B's persist() никогда не вызывается. Как сделать так, чтобы editorDriver запускался как в контексте ARequest, так и в контексте запроса BRequest? (так как я хочу для B InstanceRequest<AProxy,Void> persist()
быть вызванным, когда мои правки относятся только к объектам B.)
Кроме того, AFAICT, если у меня есть редактор в BProxy, любой объект b, который отображается редактором (и следует за контрактом редактора), должен автоматически редактироваться драйвером context.edit(b), чтобы сделать его изменчивым. Однако в моем случае "контекст" - это ARequest, а не BRequest.
Должен ли я создать ValueAwareEditor, как упомянуто здесь: GWT Editor Framework и создать новый BRequest внутри flush()
вызвать и запустить его, чтобы изменения в B сохранялись отдельно в BRequest до запуска ARequest?
editorDriver.getPaths()
дает мне:
"БС"
Кроме того, водитель определенно видит изменение в собственности B, так как editorDriver.isChanged()
возвращает истину, прежде чем я запускаю () контекст.
В моих журналах на стороне клиента или сервера нет ошибок, и процессор аннотаций работает без предупреждений.
Вот как я настраиваю свой драйвер:
editorDriver = GWT.create(Driver.class);
editorDriver.initialize(rf, view.getAEditor());
final ARequest aRequest = rf.ARequest();
final Request<List<AProxy>> aRequest = aRequest.findAByUser(loginInfo.getUserId());
String[] paths = editorDriver.getPaths();
aRequest.with(paths).fire(new Receiver<List<AProxy>>() {
@Override
public void onSuccess(List<AProxy> response) {
AProxy a = response.get(0);
ARequest aRequest2 = rf.aRequest();
editorDriver.edit(a, aRequest2);
aRequest2.persist().using(a);
}
});
Вот как выглядят мои сущности:
public abstract class PersistentEntity {
public Void persist() {
PersistenceManager pm = getPersistenceManager();
try {
pm.makePersistent(this);
} finally {
pm.close();
}
return null;
}
public Void remove() {
PersistenceManager pm = getPersistenceManager();
try {
pm.deletePersistent(this);
} finally {
pm.close();
}
return null;
}
}
@PersistenceCapable(identityType = IdentityType.APPLICATION)
@Version(strategy=VersionStrategy.VERSION_NUMBER, column="VERSION",
extensions={@Extension(vendorName="datanucleus", key="field-name", value="version")})
public class A extends PersistentEntity {
... (Id, version omitted for brevity)
@Persistent
private String name;
@Persistent
private List<B> bs;
public String getName() {
return name;
}
...
public void setName(String name) {
this.name = name;
}
public List<B> getBs() {
return bs;
}
public void setBs(List<B> bs) {
this.bs = bs;
}
}
... (same annotations as above omitted for brevity)
public class B extends PersistentEntity {
... (Id, version omitted for brevity)
@Persistent
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Вот прокси:
@ProxyFor(A.class)
public interface AProxy extends EntityProxy {
String getName();
List<BProxy> getBs();
void setName(String name);
void setBs(List<BProxy> bs);
}
@ProxyFor(B.class)
public interface BProxy extends EntityProxy {
String getName();
void setName(String name);
}
Вот мои сервисные заглушки:
@Service(A.class)
public interface ARequest extends RequestContext {
Request<List<A>> findAByUser(String userId);
InstanceRequest<AProxy, Void> persist();
InstanceRequest<AProxy, Void> remove();
}
@Service(B.class)
public interface BRequest extends RequestContext {
Request<List<A>> findB(String key);
InstanceRequest<BProxy, Void> persist();
InstanceRequest<BProxy, Void> remove();
}
Редактировать: теперь я изменил свой интерфейс ARequest и реализацию сервиса для поддержки метода "saveAndReturn", чтобы я мог рекурсивно "сохранять" "a" на стороне сервера:
Request<UserSandboxProxy> saveAndReturn(AProxy aProxy);
Теперь я обнаружил, что когда я "сбрасываю" свой RequestFactoryEditorDriver, объект контекста на стороне клиента получает мое новое значение "b.name". Однако, если я вызываю "context.fire()" и проверяю мой метод "saveAndReturn" на стороне сервера, результирующий объект на стороне сервера "a", непосредственно перед тем, как я "сохраню" его, не содержит изменения в " b.name "на любой элемент списка.
Почему это может происходить? Как мне отладить, почему эта информация о клиенте не передается по проводам на сервер?
Варианты, которые я рассмотрел, опробовал и исключил:
1) Обеспечение запуска APT и отсутствие предупреждений / ошибок на интерфейсах Proxy или Service.
2) Обеспечение того, чтобы мои прокси имели действительный установщик в AProxy для списка
1 ответ
Для правильной работы RequestFactory необходимо использовать шаблон сеанса для запроса. Подробнее здесь: https://code.google.com/p/google-web-toolkit/issues/detail?id=7827