CXF没有生成枚举映射?

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

如果我打开生成的类,这是wsdl片段:

                

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

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

更新:自定义绑定文件:

        

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

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

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

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

而且,对于Style,您的XML消息的值不正确(不是A,B,C之一),使用getStyle()时,您将获得null。 因此,在每个gerStyle()之后,你必须添加一个非空的检查,而不是有好消息“在…消息在线……位置……有不正确的数据”。 如果你不希望用户获得NullPointerException

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

“为什么结果是String,而不是Enum?”

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

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