CXF没有生成枚举映射?

时间:2014-05-08 11:48:13

标签: java web-services enums wsdl cxf

我正在使用CXF文件中的wsdl(wsdl2java)生成类,但只有一个枚举映射到String

如果我打开生成的类,这是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>

为什么结果为String,而不是Enum? 这是自动生成的结果:

private String type;

public String getType() {
    return type;
}

public void setType(String value) {
    this.type = value;
}

更新:自定义绑定文件:

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

2 个答案:

答案 0 :(得分:2)

我的实验结果显示以下信息。我无法在CXF手册中找到任何有用的东西。

  • 如果在另一个类型中声明一个类型,并且它是simpletype,则容器java类中只有一个类型,但只有一个字段。如果您的限制基于string,则您将拥有String类型的字段。
  • 如果内部类型为complextype(您必须在simplecontentcomplextype之间放置restriction元素),您的内部类具有正确的名称,但它不是真正的枚举。您可以按getValue()获取字符串值。您可以使用任何字符串数据,并且不会收到任何错误。 (恕我直言,绝对无用的变体)
  • 如果您将枚举声明为没有容器类型的complextype,则将其作为公共非内部类。另外,它与之前一样。同样,它不是枚举,没有检查正确性,没有真正的限制。无用的。
  • 如果您在任何容器类型之外声明枚举类型,并且它将是simpletype,则您具有公共非内部枚举。显然,这是你想要看到的。

更糟糕的是,即使第四个变体也不会在XML消息中捕获错误。如果:

enumeration StyleType {A,B,C}
...
StyleType Style 

对于Style,您的XML消息不正确(不是A,B,C之一),使用getStyle()时,您只会得到null。因此,在每个gerStyle()之后,你必须在每个gerStyle()之后添加一个非空的检查,而不是在...消息中有好消息&#34;在......消息中......位置... ...如果您不希望用户获得NullPointerException

答案 1 :(得分:0)

  

“......只有一个枚举映射到一个字符串。”

     

“为什么结果是字符串,而不是枚举?”

当您的某个枚举值不是有效的Java标识符(例如:以数字开头)时,可能会发生这种情况 - JAXB(cxf的wsdl2java委托工作到的)事实上被迫使用{{1} }字段,否则生成的代码将无法编译。

推荐阅读:http://blog.bdoughan.com/2011/08/jaxb-and-enums.html