Сохранение данных в Wicket без PropertyModels

Я пытаюсь создать веб-приложение, используя Wicket и OrientDB. Я пытаюсь избежать написания/поддержки плоского класса Java, который представляет каждый класс вершин как POJO (например, ORM). Скорее, я отправляю сами вершины на весь веб-слой. Я получаю доступ к свойствам через:

vertex.getProperty("propertyName");

Это означает, что сами свойства не являются переменными-членами Vertex и, следовательно, не могут быть доступны через обычные геттеры/сеттеры. У меня возникла проблема с Wicket, потому что многие компоненты зависят от реализации стиля «PropertyModel», когда вы передаете модель, которая представляет одну из переменных-членов класса, с которым вы работаете, и данные хранятся в этой переменной-члене .

У меня есть этот DataView, который извлекает свойства вершины в метку и текстовое поле.

public VertexViewer(final PageParameters pageParameters, OrientVertex vertex)
    this.vertex = vertex;
    this.properties = this.vertex.getProperties();

    List<String> keyList = new ArrayList<>();
    keyList.addAll(this.vertex.getPropertyKeys());

    final DataView<String> propertiesView = new DataView<String>("properties", new ListDataProvider<>(keyList)) {
        @Override
        protected void populateItem(Item item) {

            String key = item.getModelObject().toString();
            item.add(new Label("property_name", key));
            item.add(new TextField<String>("edit_field", new Model<String>(properties.get(key).toString())));
        }
    };
    add(propertiesViewer);
}

И HTML:

<wicket:extend>
    <div wicket:id="properties" style="display: table-row;">
        <div wicket:id="property_name" style="display: table-cell;"></div>
        <input wicket:id="edit_field" type="text" style="display: table-cell;"/>        
    </div>
</wicket:extend>

Это делает именно то, что я хочу, но есть ли у кого-нибудь рекомендации о том, как я могу сохранить данные, которые изменяются в TextFields? Я не могу использовать модель переменной-члена, как обычно делаю в форме, потому что я никогда точно не знаю, какие/сколько свойств будет в вершине. Я иду об этом совершенно неправильно? Любая помощь очень ценится.


person Ethan Hohensee    schedule 11.11.2015    source источник
comment
Короче говоря, есть ли способ извлечь новые данные из моделей, созданных в цикле for(), без добавления переменных-членов для каждого потенциального фрагмента данных?   -  person Ethan Hohensee    schedule 12.11.2015


Ответы (2)


Взгляните на https://github.com/OrienteerDW/wicket-orientdb. Разработчик этой библиотеки также создал https://issues.apache.org/jira/browse/WICKET-5623, но это улучшение не получило широкой поддержки. Пожалуйста, не стесняйтесь голосовать за него, если вы считаете, что это необходимо.

person martin-g    schedule 11.11.2015
comment
Это похоже именно то, что мне нужно. Спасибо, что обратили на это мое внимание. Однако я не вижу места, где я могу проголосовать? - person Ethan Hohensee; 12.11.2015
comment
Догадаться. Зарегистрировался, проголосовал и добавил в список наблюдения. Спасибо. - person Ethan Hohensee; 12.11.2015

Итак, после долгих проб и ошибок (в основном ошибок) я нашел шаблон, который обходит недостатки Wicket NoSQL и не требует ручного создания переменных-членов для создания моделей.

Я получаю Map<String, Object> из vertex.getProperties(), а затем создаю его копию.

private Map<String, Object> realProperties = baseVertex.getProperties();
private Map<String, Object> dummyProperties = new HashMap<>();
dummyProperties.putAll(realProperties);

Это позволяет мне использовать значения в dummyProperties в качестве моделей для хранения данных.

List<String> keyList = new ArrayList<>();
keyList.addAll(getDummyProperties().keySet());

final DataView<String> propertiesView = new DataView<String>("properties", new ListDataProvider<>(keyList)) {
        @Override
        protected void populateItem(Item item) {

            String key = item.getModelObject().toString();
            item.add(new Label("property_name", key));
            item.add(new TextField<String>("edit_field", new PropertyModel<String>(getDummyProperties(), key)));
        }
};

Оттуда я помещаю DataView в форму с помощью AjaxButton, который сравнивает потенциальные новые значения в TextFields с исходными значениями посредством некоторого запутанного цикла.

AjaxButton saveButton = new AjaxButton("saveButton") {
        @Override
        protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
            super.onSubmit(target, form);
            Map<String, Object> changedProperties = new HashMap<>();
            // for each entry in the dummy values linked via PropertyModel to the TextField input
            for (Map.Entry<String,Object> dummyEntry : getDummyProperties().entrySet()) {
                // for each entry in the
                for (Map.Entry<String,Object> realEntry : baseVertex.getProperties().entrySet()) {
                    // if the keys match
                    if (dummyEntry.getKey().equals(realEntry.getKey())) {
                        // if the value has changed
                        if (!dummyEntry.getValue().equals(realEntry.getValue())){

                            // value in textField differs from value in database
                            changedProperties.put(dummyEntry.getKey(),dummyEntry.getValue());
                        }
                    }
                }
            }

            DBWorker worker = new DBWorker();
            // perform the update
            worker.updateVertex(recordID, changedProperties);
            // pull the fresh vertex out and pass it to the page again
            setResponsePage(new VertexViewer(new PageParameters(), new CustomVertex(worker.getVertexByID(recordID))));
       }
};

Это заканчивается оценкой новых значений по сравнению со старыми, записью новых значений обратно в базу данных, получением новой вершины и вызовом новой ViewerPage, которая принимает обновленную вершину в качестве аргумента.

Это работает по назначению, является общим для класса вершин/количества свойств и не позволяет мне поддерживать классы стиля ORM для каждого класса вершин.

person Ethan Hohensee    schedule 12.11.2015