【问题标题】:JAXB - Beans to XSD or XSD to beans?JAXB - bean 到 XSD 或 XSD 到 bean?
【发布时间】:2011-01-29 19:39:22
【问题描述】:

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

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

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

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

我倾向于先从 XSD 开始,但我必须编写和维护一个单独的映射类来在我的世界和 JAXB 世界之间穿梭数据,这似乎很糟糕。

有什么建议吗?

【问题讨论】:

    标签: java xml xsd jaxb


    【解决方案1】:

    在我看来,从现有类生成 XSD 是最安全的方法。

    但是我认为,除非您非常了解 JAXB,否则注释您自己的类的方法可能会变得非常令人沮丧(无论是痛苦还是时间 :))。

    当我尝试从 JAXB 生成的类中手动提取超类然后将实例编组为 XML 时,这发生在我的相关上下文中。我得到了各种(神秘的)JAXB 异常。没错,我的 JAXB 知识还没有那么深。

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

    您可以使用 XSD + XJC 来了解如何注释自己的类。然后,您可以尝试将正确的注释安装到它们上。尽早从更复杂的类(引用、继承、引用列表、对抽象基类的引用列表)开始。

    使用另一种技术从非注释类生成 XSD 作为 XSD 的启动可能会有所帮助。或者,您可能会选择涵盖大部分课程使用的 XSD。

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

    我们使用 HyperJAXB 生成基于一组 XSD 的持久层。生成的类也用于编组。我们有很多“乐趣”让它发挥作用,尤其是。因为 IDREF 和 JAXBElement。

    【讨论】:

      【解决方案2】:

      字里行间,我相信以下是真的:

      1. 你有你想要的对象模型。
      2. 您拥有所需的 XML 架构,或者至少非常了解您希望它的外观。

      这种情况通常被称为“中间相遇”映射。 JAXB 只能部分解决它。幸运的是,由于 JAXB 是一种规范,因此您可以使用其他实现,例如 EclipseLink JAXB (MOXy)。

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

      【讨论】:

        【解决方案3】:

        您可以使用 xjc 并且仍然只有一个带有 XML 注释的类将作为数据对象服务。但这是为了防止您没有在每个构建时重新生成类。

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • JAXB 2 的设计考虑了这种情况。如果你想在没有注释的情况下表达你的映射,你可以使用像 EclipseLink MOXy 这样的 JAXB 实现。
          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-04-27
            • 2012-07-05
            • 2011-06-11
            • 2023-03-12
            • 1970-01-01
            • 1970-01-01
            • 2011-06-06
            • 2011-05-28
            相关资源
            最近更新 更多