Может ли JaVers отслеживать изменения в классах модели JavaFX, используя наблюдаемые свойства? - PullRequest
0 голосов
/ 24 мая 2018

Я работаю над приложением JavaFX, где все объекты нашей модели используют наблюдаемые значения объекта.Мы также используем EclipseLink MOXY для сериализации нескольких моделей в файлы XML, поэтому сохранение значений в ObjectProperty<T> необходимо, если в выводе свойства со значением NULL отсутствует тег ( требуемая функция ),Мы также ищем способ отслеживать изменения в нескольких модельных объектах и ​​начали изучать JaVers, но столкнулись с некоторыми проблемами.

Поскольку JaVers использует GSON под капотом, мы не смогли успешно использовать его успешно.Похоже, у GSON есть проблемы с реконструкцией классов моделей с использованием наблюдаемых свойств.Вот краткий пример класса модели:

class Demo {

    private ObjectProperty<String> someProp =
        new SimpleObjectProperty<>(this, "someProp");

    public Demo(String someProp) {
        this.someProp.setValue(someProp);
    }

    public ObjectProperty<String> somePropProperty() {
        return someProp;
    }

    @Id
    public String getSomeProp() {
        return someProp.getValue();
    }

    public void setSomeProp(String someProp) {
        this.someProp.setValue(someProp);
    }
}

Вот как мы можем попытаться использовать JaVers с этим классом модели ( Примечание: я не включил ни одну из аннотаций JAXB ) ...

Javers javers = JaversBuilder
    .javers()
    .withMappingStyle(MappingStyle.BEAN)
    .build;

Demo demo = new Demo("one");

javers.commit("test", demo);

demo.setSomeProp("two");

javers.commit("test", demo);

JqlQuery query = QueryBuilder.byInstanceId("one", Demo.class).build();

// this throws runtime exception: java.lang.RuntimeException: Failed to 
// invoke public javafx.beans.property.ObjectProperty() with no args
List<Shadow<Demo>> shadows = javers.findShadows(query);

Анализ трассировки стека наводит меня на мысль, что причиной этого является GSON.Самая верхняя часть следа имеет: at com.google.gson.internal.ConstructorConstructor$3.construct(ConstructorConstructor.java:111)

Любая помощь или совет будет принята с благодарностью!

1 Ответ

0 голосов
/ 31 мая 2018

Если ObjectProperty является своего рода оберткой для вашего домена / модели объектов, я считаю, что ее следует удалить перед передачей в JaVers.JaVers должен работать с чистыми объектами домена.См. https://javers.org/documentation/domain-configuration/#ignoring-things. Аналогичная проблема решается с помощью Hibernate Unproxy Hook, см .: https://javers.org/documentation/spring-integration/#hibernate-unproxy-hook

Может ли это решение использоваться в вашем случае?

...