如何确定先前用JAXB解组的数据已更改?

如何确定先前用JAXB解组的数据已更改?

问题描述:

我只想将JAXB中的数据编组为一个文件,如果以前解组数据已被用户更改。我知道由JAXB生成的类没有equals()方法。是否有任何简单的方法来确定数据在解组后是否已经改变?如何确定先前用JAXB解组的数据已更改?

E.g. org.w3c.dom.Document为此具有isEqualNode()方法。

我已经决定编组为一个org.w3c.dom.Document中并使用它的isEqualNode()方法。如果原始文档与新文档不同,那么我将编组为一个文件。由于我没有太多的XML数据,它对我很有用。

因此,JAXB不生成类,它从类的实例封送数据或通过解组xml填充实例。通常这些类是在XJC编译之前生成的。一种选择是更新类以包含等于方法。这不是一个好主意,因为您通常不希望更新生成的代码,以免日后需要重新生成。所以你可以编写一个实用类,它需要两个类的实例并对它们进行比较。

这是用于比较反编组后。另一种选择是在对文件进行校验和解编之前执行检查。

最好的可能是实现比较器或实用程序类来检查相等性。 你可以例如依靠commons-lang EqualsBuilderCompareToBuilder

+0

我无法理解使用EqualsBuilder的优点。你必须在你感兴趣的每个类中编写一些代码,不是吗?不是Eclipse用“Source - >生成hashCode()和equals()...”做得更好吗? – ka3ak 2012-08-07 06:58:47

+0

你见过reflectionEquals方法吗?使用Eclipse(该过程非常有用,但如果您对类进​​行更改,则必须重新生成hashCode和Equals)。使用reflectionEquals,当您添加新字段或删除另一个字段时,您不必更改代码。 – YMomb 2012-08-07 12:07:31

+0

此外,生成hashCode并等于enduce修改生成的类(这不好,因为每次重新生成代码时都必须这样做)。使用EqualsBuilder.reflectionEquals可以让你编写一个实用程序类。 – YMomb 2012-08-07 12:09:27

一个相当标准的方法是将transient boolean添加到类isDirty,并且您的setter方法将其设置为true。 (或者,如果您愿意,可以添加dateModified

显然,这需要更改您的内部类代码,这可能不合适。

您还可以保留一些Set的所有已修改的对象。但是根据代码的组织方式,获取这个逻辑正确也可能是棘手或不可能的。

+0

“isDirty”的好处是,我不需要保留原始数据的副本以供日后比较。但在另一方面,我必须找到数据可以改变的程序中的所有地方。另外,setter并不总是改变这个值,它可能会设置以前的值。 – ka3ak 2012-08-07 05:00:30

+0

如果你很幸运,代码使用setter来表示一切,在这种情况下很容易添加isDirty。但是,如果没有,是的,你必须根深蒂固。我喜欢改变这些字段的名称,或者让它们变成私有的,并让编译器告诉我什么是中断。总的来说,我不会为了设置相同的价值而超级复杂。除非这种情况发生很多,否则只会导致额外编组的“一点点”。 – user949300 2012-08-07 16:34:21

可以使用JAXB2基础插件有等于生成到你的模型类方法:

+0

是否有Eclipse的插件?我找不到任何东西。我懒得处理Maven配置等。 – ka3ak 2012-08-07 06:55:06