比方说,我们有以下Java 1.5枚举:编组站枚举属性转换成XML使用JAXB和JAXWS批注
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
@XmlAccessorType(XmlAccessType.FIELD)
public enum ReturnCode {
OK(0,"Ok"),
ERROR_VALIDATION(1,"Validation Error"),
ERROR_TRANSPORT(2, "Transport Error"),
ERROR_CASE_01(101, "Business situation #01"),
ERROR_CASE_02(102, "Business situation #02"),
ERROR_CASE_03(103, "Business situation #03");
@XmlElement(nillable=false, required=true)
private Integer code = 0;
@XmlElement(nillable=false, required=true)
private String message = null;
private ReturnCode(Integer code, String message) {
this.code = code;
this.message = message;
}
public Integer getCode() {
return code;
}
public String getMessage() {
return message;
}
}
我使用的Apache CXF和生成WSDL,如预期,转化上述枚举成限制:
<xsd:simpleType name="ReturnCode">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="OK"/>
<xsd:enumeration value="ERROR_VALIDATION"/>
<xsd:enumeration value="ERROR_TRANSPORT"/>
<xsd:enumeration value="ERROR_CASE_01"/>
<xsd:enumeration value="ERROR_CASE_02"/>
<xsd:enumeration value="ERROR_CASE_03"/>
</xsd:restriction>
</xsd:simpleType>
到目前为止这么好,这是一个理想的功能。我自己也记得在Apache CXF之前(当我使用XFire的时候)在这种结构上挣扎。
但是,这里并不是这种情况。我想产生不同的结果。我希望将枚举转换为复杂类型,并且当包含此枚举实例的对象被编组时,这两个属性代码和消息都将被转换为XML元素。我只希望它不像一个枚举。我知道如果我使用普通类而不是枚举,我可以实现这一点。不过,我非常想保留枚举值,所以我在代码的java部分保持类型安全。
如果生成的WSDL对可能的值仍然有限制,那将是一个完美的场景。但是,我可以没有它。这里主要的事情是将它保持为Java 1.5枚举,同时仍然将代码和消息作为元素进行编组(并生成WSDL)ReturnCode作为复杂类型。
我试图用提供的枚举源代码中给定的JAXWS注释来暗示。仅仅通过那些(或者其他)注释就可以完成这个任务吗?或者我是否必须编写一个自定义编组/解组器和WSDL生成器?
非常感谢!
最好的问候,
菲利佩Fedalto
我只是无意中在另一个相似的问题绊倒了。我在搜索结果中没有找到它,因为措辞有很大不同。这并不是我正在寻找的东西,但它肯定会把事情带到一半。无论如何,它涉及使用@XmlJavaTypeAdapter。你可以在[自定义值序列化的枚举]中找到它(http://stackoverflow.com/questions/4656992/providing-custom-value-serialization-for-enums-via-jaxb) –