代码之家  ›  专栏  ›  技术社区  ›  bajafresh4life

JAXB-Beans到XSD还是XSD到Beans?

  •  8
  • bajafresh4life  · 技术社区  · 16 年前

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

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

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

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

    我倾向于先从XSD开始,但是我不得不编写和维护一个单独的映射类,它在我的世界和JAXB世界之间穿梭数据,这看起来很奇怪。

    有什么建议吗?

    5 回复  |  直到 15 年前
        1
  •  6
  •   finrod    16 年前

    从现有类中生成XSD对我来说是最安全的方式。

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

    当我试图从JAXB生成的类中手动提取超类,然后将实例封送到XML时,在相关的上下文中发生了这种情况。我得到了各种(神秘的)JAXB例外。是的,我的JAXB知识还没有那么深。

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

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

    使用另一种技术从没有注释的类中生成XSD作为XSD的起点可能会有所帮助。或者您可以选择一个XSD,它覆盖了您的类使用的大部分内容。

    如果这项工作的目的也是能够将实例封送到XML中,那么我建议时刻关注JAXBRelement。在某些情况下(由于缺乏知识,我无法固定点),除非将实例包装在JAXB元素中,否则它们不会封送。

    我们使用hyperjaxb基于一组XSD生成持久层。生成的类也用于封送处理。我们有很多“乐趣”使这个工作,特别是因为idrefs和jaxbelement。

        2
  •  2
  •   bdoughan    15 年前

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

    1. 你有你想要的对象模型。
    2. 您有所需的XML模式,或者至少对它的外观有一个很好的了解。

    这种情况通常被称为“中间会合”映射。只有JAXB部分解决了这个问题。幸运的是,由于JAXB是一个规范,所以还有其他的实现,比如EclipseLink JAXB(Moxy)。

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

        3
  •  1
  •   Bozho    16 年前

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

    在我看来,正如在中一样,对于从哪里开始的问题,我建议从类开始。因为如果您将类作为起点,那么您将永远不需要重新生成这些类。随着时间的推移,你的课程开始成长——包括 @XmlTransient ,继承,助手方法和其他(JPA)注释。

        4
  •  1
  •   skaffman    16 年前

    对于JAXB来说,你可能是最糟糕的起点。在你的位置上,我在想 JiBX 最好的办法是,它可以从一个没有注释的类模型生成模式,然后在运行时将XML绑定到对象模型上,而不使用注释。

        5
  •  1
  •   steve_at_lco    16 年前

    我们的解决方案是有一个单独的项目,包含由JavaSchema定义的所有数据模型,使用JAXB派生Java类。其他使用数据模型的项目依赖于这个模式包。

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