XJC不会在xs:union中生成枚举

chr*_*sdo 7 java enums xsd jaxb xjc

我有几个包含如下结构的XSD文件:

<xs:complexType name="SomeThing" abstract="false">
    <xs:sequence>
        <xs:element name="id" type="schema2:SomeIdTypeClass" minOccurs="1" maxOccurs="1"/>
        <xs:element name="myType" type="schema1:MyType" minOccurs="1" maxOccurs="1"/>
    </xs:sequence>
</xs:complexType>

<xs:simpleType name="MyType">
    <xs:union>
        <xs:simpleType>
            <xs:restriction base="xs:string">
                    <xs:enumeration value="APPLE"/>
                    <xs:enumeration value="ORANGE"/>
                    <xs:enumeration value="BANANA"/>
                </xs:restriction>
            </xs:simpleType>
            <xs:simpleType>
                <xs:restriction base="xs:string">
                <xs:pattern value="OTHER:[a-zA-Z_][a-zA-Z0-9_]*"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:union>
</xs:simpleType>
Run Code Online (Sandbox Code Playgroud)

我使用XJC命令在控制台上生成Java类,而不是maven或ant或任何其他构建工具.

除了这些枚举之外,所有类似乎都生成了.使用枚举类型的类只是将它作为String引用,例如,Something类仅包含MyType作为String,而不是像我期望的那样包含ENUM.

在另一个文件中我有这样的东西,其中生成的枚举没有问题,并且引用类正在使用它作为枚举.

<xs:simpleType name="SizeType">
<xs:restriction base="xs:string">
        <xs:enumeration value="SMALL"/>
        <xs:enumeration value="MEDIUM"/>
        <xs:enumeration value="LARGE"/>
</xs:restriction>
Run Code Online (Sandbox Code Playgroud)

我不想替换XSD文件,因为它们不是由我自己生成的,而且我有一些包含许多这些元素的文件.

我得出结论,我需要使用某种XJB绑定文件,但我无法弄清楚,我需要在那里写什么:

以下仅给出了错误"导致目标节点过多"

<jaxb:bindings version="2.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
jaxb:extensionBindingPrefixes="xjc">
    <jaxb:bindings schemaLocation="MySchema.xsd" node="/xs:schema">
        <jaxb:bindings node="//xs:simpleType[@name='MyType']/xs:union/xs:simpleType">
            <jaxb:typesafeEnumClass name="MyType"/>
        </jaxb:bindings>    
    </jaxb:bindings>
</jaxb:bindings>
Run Code Online (Sandbox Code Playgroud)

添加multiple ="true"解决了这个问题,但仍然没有给我想要的枚举.

编辑:当我删除xs:union时,我有一个正常的xs:simpleType,如下所示:

<xs:simpleType name="MyType">
    <xs:restriction base="xs:string">
    <xs:pattern value="OTHER:[a-zA-Z_][a-zA-Z0-9_]*"/>
    <xs:enumeration value="APPLE"/>
    <xs:enumeration value="ORANGE"/>
    <xs:enumeration value="BANANA"/>
    </xs:restriction>             
</xs:simpleType>
Run Code Online (Sandbox Code Playgroud)

然后它按预期工作.如果我不需要,我仍然不想沿着那条路走下去并编辑模式.必须有一些方法.

ToY*_*nos 5

好的,我已经花了一些时间在这个主题上,我google了很多,并做了一些测试.

简短的回答:这是不可能的

细节答案:

关于SO的这个问题是关于一个人有同样的问题但更简单:他有一个union包含一个simpleType(一个restriction有一些enumeration),这很奇怪,因为这union是毫无意义的,但无论如何.

所以这家伙被困住了,这个答案非常有趣:

看起来工会得不到很好的支持 https://jaxb.java.net/tutorial/section_2_2_10-Defining-a-Type-Union.html

如果你可以修改模式,你可以将枚举的匿名简单类型提取到命名类型,然后在你的代码中使用为这个新类型生成的Java枚举....

没有得到很好的支持......但是在"根本没有"或"在某些情况下"不是很好?

不幸的是,链接被破坏了,但多亏了我们的朋友The Internet Archive,我拿出了我需要的信息:

在Java中,没有方便的方式来表达简单类型的联合.JAXB编译器只需在使用联合类型的任何地方插入Java的String类型,并将其留给应用程序程序员来处理其余部分.尽量避免xsd:union.

所以这就是结束了,你被困住了.只要union存在于模式中,emum就不会生成任何类,并且String始终将其选为默认类型.

此外,我发现这篇文章,在XML模式中扩展枚举列表.在某些解决方案中,作者主张使用union但最终说:

需要<xsd:union>标记支持,有时不在工具中实现

最后,最好的解决方案可能是文章中的第一个:编辑原始模式以包含新的枚举值