请求工厂GWT编辑器更改不会持久保存相关的JDO实体

时间:2012-12-26 13:29:43

标签: google-app-engine gwt one-to-many requestfactory gwt-editors

我在GWT 2.5中使用(和新的)RequestFactory,在AppEngine数据存储上使用具有一对多关系的JDO实体。我刚刚开始使用GWT RequestFactoryEditorDriver来显示/编辑我的对象。

驱动程序遍历我的对象,并正确显示它们。但是,当我尝试编辑“相关”对象上的值时,更改不会持久保存到数据存储区。

当我在用户界面上更改b.name并点击“保存”时,我注意到只有A的persist()来电被调用。 B的persist()永远不会被调用。如何让editorDriver同时触发ARequest和BRequest请求上下文? (因为当我的编辑仅针对B对象时,我想要的是调用B的InstanceRequest<AProxy,Void> persist()。)

另外,AFAICT,如果我有一个关于BProxy的编辑器,编辑器显示的任何对象b(以及编辑合同之后)应该自动成为驱动程序的“context.edit(b)”以使其成为可变的。但是,在我的情况下,“上下文”是一个ARequest,而不是一个BRequest。

我是否必须制作如此处所述的ValueAwareEditor:GWT Editor framework 并在flush()调用中创建一个新的BRequest并触发它,以便在ARequest被解雇之前,在BRequest中分别保留对B的更改?

editorDriver.getPaths()给了我: “BS”

此外,驱动程序肯定会看到对B属性的更改,因为editorDriver.isChanged()在我触发()上下文之前返回true。

我的客户端或服务器端日志没有错误,并且Annotation Processor在没有警告的情况下运行。

以下是我设置驱动程序的方法:

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已运行,并且代理服务或服务接口上没有警告/错误

2)确保我的代理在AProxy中有一个有效的setter for List

1 个答案:

答案 0 :(得分:2)

使用Request-Per-request模式让RequestFactory正常工作。更多详情:https://code.google.com/p/google-web-toolkit/issues/detail?id=7827