Java CXF没有生成枚举映射?
我用Java CXF没有生成枚举映射?,java,web-services,enums,wsdl,cxf,Java,Web Services,Enums,Wsdl,Cxf,我用wsdl文件中的CXF(wsdl2java)生成类,但是一个枚举只映射到字符串 如果打开生成的类,这是wsdl片段: <complexType> <complexContent> <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> <attribute name="Type" use="required"> <
wsdl
文件中的CXF
(wsdl2java)生成类,但是一个枚举只映射到字符串
如果打开生成的类,这是wsdl片段:
<complexType>
<complexContent>
<restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
<attribute name="Type" use="required">
<simpleType>
<restriction base="{http://www.w3.org/2001/XMLSchema}string">
<enumeration value="AAA"/>
<enumeration value="VVV"/>
</restriction>
</simpleType>
</attribute>
</restriction>
</complexContent>
</complexType>
更新:自定义绑定文件:
<jaxb:bindings
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
jaxb:version="2.1">
<jaxb:bindings>
<jaxb:bindings node="//xs:attribute[@name='Type']/xs:simpleType">
<jaxb:typesafeEnumClass ref="TestEnum" />
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
“…一个枚举只映射到字符串。”
为什么结果是字符串而不是枚举
当您的一个枚举值不是有效的Java标识符(例如:以数字开头)时,可能会发生这种情况—JAXB(cxf的wsdl2java
委托它工作)实际上被强制使用String
字段,否则生成的代码将无法编译
推荐阅读:以下信息是我的实验结果。我在CXF手册中找不到任何有用的东西
- 如果在另一个类型中声明一个类型,并且它是
simpletype
,那么容器java类中没有类型,只有一个字段。如果您的限制是基于字符串
,则您将拥有字符串
类型的字段
- 如果该内部类型是
complextype
(必须在complextype
和restriction
之间放置一个simplecontent
元素),则有一个名称正确的内部类,但它不是真正的枚举。您可以通过getValue()
获取字符串值。您可以为它使用任何字符串数据,并且不会得到任何错误。(IMHO,绝对无用的变体)
- 如果将枚举声明为不带容器类型的
complextype
,则它将作为公共类而不是内部类。另一方面,它与前面的一样。同样,它没有枚举,没有正确性检查,没有真正的限制。没用
- 如果在任何容器类型之外声明枚举类型,并且它将是一个
simpletype
,则您拥有一个公共非内部枚举。显然,这是你想看到的
更糟糕的是,即使是第四个变量也无法捕获XML消息中的错误。如果:
enumeration StyleType {A,B,C}
...
StyleType Style
如果XML消息的样式值不正确(不是A、B、C中的任何一个),则使用getStyle()
时将得到null。因此,您必须在每个gerStyle()之后添加一个NOTNULL检查,而不是有一个漂亮的消息“in…message on line…position…有不正确的数据”。如果您不想让用户获得NullPointerException
。因为您在bean类中明确提到了字符串,请更改此设置。如果您的wisdl xml文件中有一个绑定xml文件,您需要将其中的enum与所需类型的字符串绑定。您需要将字符串而不是SimpleType放入xml绑定文件中
enumeration StyleType {A,B,C}
...
StyleType Style