web-services – 使用JAXB和JAXWS Annotations将枚举属性编组到XML中

假设我们有以下 Java 1.5枚举:
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元素.我只希望它不像enum那样表现.我知道如果我使用普通类而不是枚举,我可以实现这一目标.但是,我非常希望保持枚举,所以我在代码的java部分保持类型安全.

如果生成的WSDL仍然可能对可能的值有限制,那么它将是完美的场景.但是,我可以没有它.这里最重要的是保持Java 1.5枚举,同时仍然编组(并生成WSDL)ReturnCode作为复杂类型,代码和消息作为其元素.

我尝试用枚举源代码中的给定JAXWS Annotations提示.是否有可能通过那些(或其他一些)注释来实现这一点?或者我是否必须编写自定义marshaller / unmarshaller和WSDL生成器?

非常感谢你!

最好的祝福,

Filipe Fedalto

解决方法

在您的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
}

相关文章

vue阻止冒泡事件 阻止点击事件的执行 &lt;div @click=&a...
尝试过使用网友说的API接口获取 找到的都是失效了 暂时就使用...
后台我拿的数据是这样的格式: [ {id:1 , parentId: 0, name:...
JAVA下载文件防重复点击,防止多次下载请求,Cookie方式快速简...
Mip是什么意思以及作用有哪些