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

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

Я переключился с 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);
        }
    }
}

person expert    schedule 27.02.2012    source источник


Ответы (2)


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

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

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

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

person Thomas Broyer    schedule 27.02.2012
comment
После многочисленных экспериментов я выяснил, что проблема не в выборе драйвера редактора. Полный график сохраняется, если я сохраняю новые объекты, но не работает, если я пытаюсь сохранить объекты, которые были извлечены из DataStore и отредактированы в форме. Что-то не так с контекстами или что-то в этом роде? Есть предположения? - person expert; 28.02.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)
    {
    }
}

Чтобы получить дочерний объект из DataStore, вам нужно иметь идентификатор родительского класса. Для этого я переключил «ID class» для Locator‹> на 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.

person expert    schedule 28.02.2012