RequestFactoryEditorDriver не сохраняет полный график, даже если вызывается «with ()».Является ли циркулярная ссылка проблемой? - PullRequest
1 голос
/ 27 февраля 2012

Не могли бы вы, ребята, помочь мне найти, где я допустил ошибку?

Я переключился с SimpleBeanEditorDriver на RequestFactoryEditorDriver, и мой код больше не сохраняет полный график, даже если вызван метод with().Но он корректно загружает полный граф в конструктор.

Может ли это быть вызвано циклической ссылкой между OrganizationProxy и PersonProxy?Я не знаю, что еще думать :( Хотя он работал с SimpleBeanEditorDriver.

Ниже приведен мой клиентский код. Дайте мне знать, если вы хотите, чтобы я добавил источники прокси к этому вопросу (или вы можете их увидеть здесь ).

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);
        }
    }
}

Ответы [ 2 ]

1 голос
/ 27 февраля 2012

with() используется только для поиска информации, поэтому использование with() с типом возврата void бесполезно (но безвредно).

Сохранение полного графа полностью зависит от вашего серверного кода, который тесно связан с вашим постоянным API (JPA, JDO и т. Д.)

Сначала убедитесь, что объект Organization, полученный вами в методе save() на стороне сервера, правильно заполнен. Если это не так, проверьте ваши Locator s (и / или статические методы findXxx); в противном случае проверьте код save() метода.

Судя по приведенному выше коду, я не вижу причины, по которой это не сработает.

0 голосов
/ 28 февраля 2012

Мне потребовалось некоторое время, чтобы понять, что проблема заключалась в составной id сущности Person.

Ниже приведен фрагмент кода PojoLocator, который используется моим прокси-сущности .

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

    @Override
    public Long getId(DatastoreObject domainObject)
    {
    }
}

Чтобы получить дочернюю сущность из хранилища данных, вам необходимо иметь идентификатор родительского класса.Чтобы добиться этого, я переключил «ID class» для Locator <> на String, который представляет текстовую форму класса Objectify's 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.

...