我正在开发一个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)
非常感谢任何帮助或建议!
答案 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
此解决方案是否可用于您的情况?