2011-11-01 67 views
7

比方说,我们有以下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

+1

我只是无意中在另一个相似的问题绊倒了。我在搜索结果中没有找到它,因为措辞有很大不同。这并不是我正在寻找的东西,但它肯定会把事情带到一半。无论如何,它涉及使用@XmlJavaTypeAdapter。你可以在[自定义值序列化的枚举]中找到它(http://stackoverflow.com/questions/4656992/providing-custom-value-serialization-for-enums-via-jaxb) –

回答

0

使用枚举在Java服务器代码,并转换成复杂的输入您的服务的接口。

例子:

@WebMethod 
public ComplexType GetInfo(){ 
    ReturnCode response; 
    response = ReturnCode.OK; 
    ComplexType wsResponse; 
    wsResponse = response.toComplexType() 
    return wsResponse; 
} 

@WebMethod 
public void PutInfo(ComplexType input){ 
    ReturnCode request = ReturnCode.fromComplexType(input); 
    //more code 
}