JAXB - 豆到XSD或XSD到豆?

时间:2010-03-20 14:47:50

标签: java xml xsd jaxb

我有一个现有的数据模型。我想用XML来表达这个数据模型。

如果我要使用JAXB,我看起来有两个选择:

  • 创建一个镜像我的数据模型的XSD,并使用xjc创建绑定对象。编组和解组将涉及创建一个“映射”类,它将获取我现有的数据对象并将它们映射到xjc创建的对象。例如,在我的数据模型中,我有一个Doc类,而JAXB会创建另一个具有基本相同字段的Doc类,我必须从我的Doc类映射到xjc的Doc类。
  • 使用JAXB注释注释我现有的数据模型,并使用schemagen从我的注释类生成XSD。

我可以看到两种方法的优点和缺点。似乎大多数使用JAXB的人都是从XSD文件开始的。因为它以真正的跨平台方式表达数据模型,所以XSD应该是黄金标准的真理是有道理的。

我倾向于先从XSD开始,但是我必须编写并维护一个单独的映射类,以便在我的世界和JAXB世界之间传递数据。

有什么建议吗?

5 个答案:

答案 0 :(得分:6)

从现有类生成的XSD听起来像是最安全的方式。

然而,除非你很了解JAXB,否则注释你自己的类的方法可能会变得非常令人沮丧(在痛苦和时间:))。

当我尝试从JAXB生成的类中手动提取超类,然后将实例封送到XML时,在相关的上下文中发生了这种情况。我得到了各种(神秘的)JAXB异常。没错,我的JAXB知识还不够深入。

如果你坚持使用JAXB,那么我建议考虑使用第一种方法(XSD + XJC)作为获取类的初始JAXB注释的方法。

您可以使用XSD + XJC来了解如何为自己的类添加注释。然后,您可以尝试将正确的注释放在它们上面。早期从更复杂的类(引用,继承,引用列表,抽象基类的引用列表)开始。

使用其他技术从非注释类生成XSD作为XSD上的启动可能会有所帮助。或者你可以选择一个涵盖课程大部分内容的XSD。

如果这项工作的目的是也能够将实例编组为XML,那么我建议关注JAXBElement。在某些情况下(由于缺乏知识,我无法指出)实例不会编组,除非它们被包装在JAXBElement中。

我们使用HyperJAXB基于一组XSD生成持久层。生成的类也用于编组。我们有足够的“乐趣”使这成为特别工作。因为IDREF和JAXBElement。

答案 1 :(得分:2)

在线之间阅读,我相信以下是正确的:

  1. 您拥有所需的对象模型。
  2. 您拥有所需的XML架构,或者至少非常了解您希望它的外观。
  3. 此场景通常称为“中间相遇”映射。它只是由JAXB部分解决。幸运的是,由于JAXB是一个规范,因此可以使用其他实现,例如EclipseLink JAXB(MOXy)。

    MOXy提供了一个基于XPath的映射扩展,允许您在您拥有的Java模型和所需的XML模式之间进行映射:

答案 2 :(得分:1)

您可以使用xjc,但仍然只有一个带有XML注释的类,它将作为数据对象提供服务。但是,如果您没有在每个构建的类上重新生成类,那就是这样。

正如代码生成在我看来,对于从何处开始的问题,我建议从课程开始。因为如果您将类作为起点,则永远不需要重新生成这些类。随着时间的推移,你的课程开始增长 - 包括@XmlTransient,继承,辅助方法和其他(JPA)注释。

答案 3 :(得分:1)

你几乎是JAXB最糟糕的起点。在你的位置,我认为JiBX可能是更好的选择,它可以从非注释的类模型生成模式,然后在运行时将XML绑定在对象模型上,而不使用注释。

答案 4 :(得分:1)

我们使用的解决方案是拥有一个单独的项目,其中包含由xml架构定义的所有数据模型,使用JAXB从中派生java类。使用数据模型的其他项目依赖于此模式包。

通过这种方式,项目之间的所有“契约”都使用友好的可移植xsd表示在一个地方定义。不需要任何映射类,因为我们只是直接使用JAXB生成的映射类。