Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JAXB-Beans到XSD还是XSD到Beans?_Java_Xml_Xsd_Jaxb - Fatal编程技术网

Java JAXB-Beans到XSD还是XSD到Beans?

Java JAXB-Beans到XSD还是XSD到Beans?,java,xml,xsd,jaxb,Java,Xml,Xsd,Jaxb,我有一个现有的数据模型。我想用XML来表示这个数据模型 如果要使用JAXB,我似乎有两个选择: 创建一个镜像我的数据模型的XSD,并使用xjc创建绑定对象。编组和解编组将涉及创建一个“映射”类,该类将获取现有数据对象并将它们映射到xjc创建的对象。例如,在我的数据模型中,我有一个Doc类,JAXB将创建另一个具有基本相同字段的Doc类,并且我必须从我的Doc类映射到xjc的Doc类 使用JAXB注释注释我现有的数据模型,并使用schemagen从注释的类生成XSD 我可以看出这两种方法的优点

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

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

  • 创建一个镜像我的数据模型的XSD,并使用xjc创建绑定对象。编组和解编组将涉及创建一个“映射”类,该类将获取现有数据对象并将它们映射到xjc创建的对象。例如,在我的数据模型中,我有一个Doc类,JAXB将创建另一个具有基本相同字段的Doc类,并且我必须从我的Doc类映射到xjc的Doc类
  • 使用JAXB注释注释我现有的数据模型,并使用schemagen从注释的类生成XSD
我可以看出这两种方法的优点和缺点。似乎大多数使用JAXB的人都是从XSD文件开始的。XSD应该是黄金标准,因为它以真正跨平台的方式表达数据模型,这是有道理的

我倾向于先从XSD开始,但我必须编写和维护一个单独的映射类,在我的世界和JAXB世界之间传递数据,这似乎很棘手


有什么建议吗?

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


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

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

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


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

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

然而,我认为,除非您非常了解JAXB,否则注释您自己的类的方法可能会非常令人沮丧(痛苦和时间:)

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

如果您坚持使用JAXB,那么我建议考虑使用第一种方法(XSD+XJC)来获取类的初始JAXB注释。 您可以使用XSD+XJC了解如何注释自己的类。然后,您可以尝试将正确的注释安装到它们上。从更复杂的类(引用、继承、引用列表、抽象基类的引用列表)开始

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

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


我们使用HyperJAXB基于一组XSD生成持久层。生成的类也用于封送处理。特别是由于IDREFs和JAXBElement,我们有很多“乐趣”让它发挥作用。

在字里行间,我相信以下是正确的:

  • 您已经拥有了所需的对象模型
  • 您已经有了所需的XML模式,或者至少对它的外观有了相当好的了解
  • 此场景通常称为“中间相遇”映射。JAXB只解决了部分问题。幸运的是,因为JAXB是一种规范,所以可以使用其他实现,如EclipseLink JAXB(MOXy)

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


    JAXB2的设计考虑到了这个场景。如果您希望在没有注释的情况下表达映射,那么可以使用像EclipseLink MOXy这样的JAXB实现。