JAXB - 将Beans转换为XSD还是将XSD转换为Beans?

8

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

如果要使用JAXB,似乎有两个选项:

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

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

我倾向于先从XSD开始,但是我必须编写和维护一个单独的映射类,以在我的世界和JAXB世界之间传输数据,这似乎不太好。

有什么建议吗?

5个回答

6
从现有类生成XSD对我来说似乎是最安全的方法。然而,如果你不熟悉JAXB,那么注释自己的类可能会变得非常令人沮丧(无论是痛苦还是时间方面)。在相关环境中,当我尝试从JAXB生成的类中手动提取超类,然后将实例转换为XML时,我遇到了各种各样(晦涩难懂的)JAXB异常。我的确没深入了解过JAXB。
如果您坚持使用JAXB,则建议考虑使用第一种方法(XSD + XJC)作为获取类的初始JAXB注释的方式。您可以使用XSD + XJC来了解如何为自己的类进行注释。然后,您可以尝试将正确的注释放到它们上面。从开始即着手处理较复杂的类(引用、继承、引用列表、抽象基类的引用列表)。
使用其他技术从未注释的类生成XSD作为启动XSD的一种方法可能会有所帮助。或者,您可以选择一个涵盖大多数类使用内容的XSD。
如果这个项目的目的也是将实例转换为XML,则建议关注JAXBElement。在某些情况下(由于缺乏知识,我无法确定具体是哪些情况),实例不会转换,除非它们被包装在JAXBElement中。
我们使用HyperJAXB基于一组XSD生成持久化层。这些生成的类也用于编组。IDREFs和JAXBElement使得我们在让其工作时碰到了很多麻烦。

2
阅读行间,我相信以下内容是正确的:
  1. 你已经拥有了所需的对象模型。
  2. 你已经拥有了所需的XML模式,或者至少对你希望它看起来如何有一个很好的想法。
这种情况通常被称为“中间会合”映射。这只有部分被JAXB解决。幸运的是,由于JAXB是一个规范,你可以使用其他实现,比如EclipseLink JAXB(MOXy)。
MOXy提供了一种基于XPath的映射扩展,允许你在你拥有的Java模型和你想要的XML模式之间进行映射:

1

你可以使用xjc,仍然只有一个带有XML注释的类作为数据对象。但这是在您不会在每次生成时重新生成类的情况下。

就我的看法,在编写代码时,建议从类开始。因为如果您将类作为起点,您将永远不需要重新生成这些类。随着时间的推移,您的类将开始增长 - 包括@XmlTransient、继承、辅助方法和其他(JPA)注释。


1

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


JAXB 2是以这种情况为考虑设计的。如果您想要在没有注释的情况下表达您的映射,可以使用像EclipseLink MOXy这样的JAXB实现。 - bdoughan

1
我们采用的解决方案是创建一个独立的项目,其中包含由 XML Schema 定义的所有数据模型,使用 JAXB 派生 Java 类。使用数据模型的其他项目依赖于此模式包。
通过这种方式,所有项目之间的“合同”都在一个地方使用漂亮且可移植的 XSD 表示定义。无需任何映射类,因为我们直接使用 JAXB 生成的类。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接