java - XJC 不在 xs :union 内生成枚举

标签 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>

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

除了这些类型的枚举之外,所有类似乎都可以正常生成。使用枚举类型的类仅将其引用为字符串,例如Something 类只包含 MyType 作为字符串,而不是像我期望的那样作为 ENUM。

在另一个文件中,我有类似这样的内容,其中生成的枚举没有问题,并且引用类按应有的方式将其用作枚举。

<xs:simpleType name="SizeType">
<xs:restriction base="xs:string">
        <xs:enumeration value="SMALL"/>
        <xs:enumeration value="MEDIUM"/>
        <xs:enumeration value="LARGE"/>
</xs:restriction>

我不想替换 XSD 文件,因为它们不是我自己生成的,而且我有几个文件包含其中的许多元素。

我得出的结论是我需要使用某种 XJB 绑定(bind)文件,但我不知道我到底需要在那里写什么:

下面只给我报错“results in too many target nodes”

<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>

添加 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>

然后它按预期工作。如果不需要的话,我仍然不想走那条路并编辑模式。一定有办法解决。

最佳答案

好的,我已经在这个主题上花了一些时间,我在谷歌上搜索了很多并做了一些测试。

简答:不可能

详细答案:

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

所以这家伙被卡住了 this answer很有趣:

It looks like unions are not well supported https://jaxb.java.net/tutorial/section_2_2_10-Defining-a-Type-Union.html

If you could modify the schema you could extract the enumerated anonymous simple type to a named type and then use in your code the Java enum generated for this new type....

没有得到很好的支持...但不如“完全没有”或“在某些情况下”那样好?

不幸的是,链接已断开,但感谢我们的 friend The Internet Archive , I pulled out我需要的信息:

In Java, there is no convenient way of expressing unions of simple types. The JAXB compiler simply inserts Java's String type wherever the union type is used and leaves it up to the application programmer to handle the rest. Try to avoid xsd:union.

这就是路的尽头,你被困住了。只要union存在于您的模式中,没有 emum将生成类并且String将始终被选为默认类型。

此外,我找到了这篇文章,Extend enumerated lists in XML schema .在一些解决方案中,作者提倡使用union但最终说:

Requires <xsd:union> tag support, which is sometimes not implemented in tools

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

关于java - XJC 不在 xs :union 内生成枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37281539/

相关文章:

java - 如何从 XML 元素生成 XSD

java - 调用方法时出错 - 尝试部署 Javafx 应用程序时无法启动 JVM

Java 查找集合中的公共(public)元素

FileZilla 的 Java FTP 连接问题

c++ - 在类中使用枚举时,它会是公开的吗?为什么?

c# - 为什么我可以将无效值解析为 .NET 中的枚举?

java - 如何解析 cvc-pattern-valid : Value '' is not facet-valid with respect to pattern problem

xml - XSD 架构 - 命名空间

java - GWT 文件上传,文件未在 POST 中发送

java - 使用枚举来**存储**行和列的数据库名称是不是有点过分了?