【问题标题】:RequestFactoryEditorDriver doesn't save full graph even though "with()" is called. Is circular reference an issue?即使调用了“with()”,RequestFactoryEditorDriver 也不会保存完整的图形。循环引用有问题吗?
【发布时间】:2012-02-28 18:21:47
【问题描述】:

你们能帮我找出我犯错的地方吗?

我从 SimpleBeanEditorDriver 切换到 RequestFactoryEditorDriver,即使调用了 with() 方法,我的代码也不再保存完整的图形。但它在构造函数中正确加载了完整的图形。

会不会是 OrganizationProxy 和 PersonProxy 之间的循环引用造成的?我不知道还能想什么 :( 不过它可以与 SimpleBeanEditorDriver 一起使用。

下面是我的客户端代码。如果您希望我为这个问题添加代理来源,请告诉我(或者您可以查看它们here)。

public class NewOrderView extends Composite
{
    interface Binder extends UiBinder<Widget, NewOrderView> {}
    private static Binder uiBinder = GWT.create(Binder.class);

    interface Driver extends RequestFactoryEditorDriver<OrganizationProxy, OrganizationEditor> {}
    Driver driver = GWT.create(Driver.class);

    @UiField
    Button save;

    @UiField
    OrganizationEditor orgEditor;

    AdminRequestFactory requestFactory;
    AdminRequestFactory.OrderRequestContext requestContext;

    OrganizationProxy organization;

    public NewOrderView()
    {
        initWidget(uiBinder.createAndBindUi(this));

        requestFactory = createFactory();
        requestContext = requestFactory.contextOrder();
        driver.initialize(requestFactory, orgEditor);

        String[] paths = driver.getPaths();
        createFactory().contextOrder().findOrganizationById(1).with(paths).fire(new Receiver<OrganizationProxy>()
        {
            @Override
            public void onSuccess(OrganizationProxy response)
            {
                if (response == null)
                {
                    organization = requestContext.create(OrganizationProxy.class);
                    organization.setContactPerson(requestContext.create(PersonProxy.class));
                } else
                    organization = requestContext.edit(response);

                driver.edit(organization, requestContext);
            }

            @Override
            public void onFailure(ServerFailure error)
            {
                createConfirmationDialogBox(error.getMessage()).center();
            }
        });
    }

    private static AdminRequestFactory createFactory()
    {
        AdminRequestFactory factory = GWT.create(AdminRequestFactory.class);
        factory.initialize(new SimpleEventBus());
        return factory;
    }

    @UiHandler("save")
    void buttonClick(ClickEvent e)
    {
        e.stopPropagation();
        save.setEnabled(false);

        try
        {
            AdminRequestFactory.OrderRequestContext ctx = (AdminRequestFactory.OrderRequestContext) driver.flush();
            if (!driver.hasErrors())
            {
                // Link to each other
                PersonProxy contactPerson = organization.getContactPerson();
                contactPerson.setOrganization(organization);

                String[] paths = driver.getPaths();
                ctx.saveOrganization(organization).with(paths).fire(new Receiver<Void>()
                {
                    @Override
                    public void onSuccess(Void arg0)
                    {
                        createConfirmationDialogBox("Saved!").center();
                    }

                    @Override
                    public void onFailure(ServerFailure error)
                    {
                        createConfirmationDialogBox(error.getMessage()).center();
                    }
                });
            }
        } finally
        {
            save.setEnabled(true);
        }
    }
}

【问题讨论】:

    标签: java gwt requestfactory gwt2


    【解决方案1】:

    with() 仅用于检索信息,因此您的 with()void 返回类型一起使用是无用的(但无害)。

    完整图是否持久化完全取决于您的服务器端代码,该代码与您的持久性 API(JPA、JDO 等)密切相关

    首先,检查您在服务器端的save() 方法中收到的Organization 对象是否已正确填充。如果不是这种情况,请检查您的 Locators(和/或静态 findXxx 方法);否则,请检查您的 save() 方法的代码。

    从上面的代码来看,我看不出它不起作用的原因。

    【讨论】:

    • 经过多次实验,我发现问题不在于编辑器驱动程序的选择。 如果我保留新对象,则会保存完整的图表,但如果我尝试保留从 DataStore 获取并在表单中编辑的实体,则无法正常工作。是上下文有问题还是什么?有什么想法吗?
    【解决方案2】:

    我花了一些时间才意识到问题出在 Person 实体的复合 id 上。

    下面是我的proxy entities使用的PojoLocator的代码sn-p。

    public class PojoLocator extends Locator<DatastoreObject, Long>
    {
        @Override
        public DatastoreObject find(Class<? extends DatastoreObject> clazz, Long id)
        {
        }
    
        @Override
        public Long getId(DatastoreObject domainObject)
        {
        }
    }
    

    为了从 DataStore 中获取子实体,您需要拥有父类的 id。为了实现这一点,我将 Locator 的“ID 类”切换为 String,它表示 Objectify 的 Key 类的文本形式。

    这是现在的样子:

    public class PojoLocator extends Locator<DatastoreObject, String>
    {
        @Override
        public DatastoreObject find(Class<? extends DatastoreObject> clazz, String id)
        {
            Key<DatastoreObject> key = Key.create(id);
            return ofy.load(key);
        }
    
        @Override
        public String getId(DatastoreObject domainObject)
        {
            if (domainObject.getId() != null)
            {
                Key<DatastoreObject> key = ofy.fact().getKey(domainObject);
                return key.getString();
            } else
                return null;
        }
    }
    

    请注意,由于我使用的是 Objectify4,因此您的实现可能略有不同。

    【讨论】:

      猜你喜欢
      • 2017-04-25
      • 2015-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      相关资源
      最近更新 更多