如何使用 XJC 影响 class 组声明的生成

How to influence class generation of group declarations with XJC

我们有以下问题。我们尝试从包含组声明和对这些组声明的多个组引用的 XSD 文件生成 Java 代码。这里有一个简化版本:

<xs:group name="Information">
  <xs:sequence>
    <xs:element name="Name">
      <xs:complexType>
        <xs:simpleContent>
          <xs:extension base="xs:string">
            <xs:attribute name="updated" type="xs:boolean"/>
          </xs:extension>
        </xs:simpleContent>
      </xs:complexType>
    </xs:element>
 </xs:sequence>
</xs:group>

<xs:element name="Address">
  <xs:complexType>
    <xs:sequence>
      <xs:group ref="Information" />
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="Customer">
  <xs:complexType>
    <xs:sequence>
       <xs:group ref="Information"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

要点是:

我们现在面临的问题是xjc生成非确定性取决于我们构建的机器,有时类型Address.Name有时类型[=15] =],因为Name元素是一个复杂类型,需要一个类型。

有没有办法让xjc总是生成相同的类型?

您可以尝试 -episode command line option of XJC。它主要用于多步编译,但我认为它基本上是 "dumps decisions" XJC 在编译到(绑定)配置文件期间采用的。如果幸运的话,您会在剧集文件中找到与 Name element/type 相关的合适设置,您可以将其复制到绑定配置文件中,以使 XJC 的行为具有确定性。

  • 使用 jaxb:class 绑定自定义匿名复杂类型并指定 class 名称。
  • 改为使用 <jaxb:globalBindings localScoping="toplevel"/> 在顶层生成内部 classes。

这两者的结合会给你一个可预测的class。