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)
然后它按预期工作.如果我不需要,我仍然不想沿着那条路走下去并编辑模式.必须有一些方法.
好的,我已经花了一些时间在这个主题上,我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>标记支持,有时不在工具中实现
最后,最好的解决方案可能是文章中的第一个:编辑原始模式以包含新的枚举值
| 归档时间: |
|
| 查看次数: |
977 次 |
| 最近记录: |