Запрос на изменение редактора 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

Другие вопросы по тегам