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
(你必须在complextype
和restriction
之间放置一个简单的内容元素),你有一个具有正确名称的内部类,但它不是真正的枚举。 您可以通过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