JaVers可以使用可观察属性跟踪JavaFX模型类的更改吗?

时间:2018-05-24 19:04:42

标签: java javafx gson javers

我正在开发一个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 :(得分:0)

如果ObjectProperty是域/模型对象的一种包装,我相信它应该在传递给JaVers之前删除。 JaVers应该使用干净的域对象。见https://javers.org/documentation/domain-configuration/#ignoring-things。 Hibernate unproxy hook解决了类似的问题,请参阅: https://javers.org/documentation/spring-integration/#hibernate-unproxy-hook

此解决方案是否可用于您的情况?