JAX-WS No Enum使用限制列表(枚举)生成解析WSDL

时间:2015-12-01 10:41:44

标签: java xsd jaxb schema jax-ws

如果WSDL类型定义如下:

<xs:simpleType name="AccountStatus">
    <xs:restriction base="xs:string">
        <xs:enumeration value="Open" />
        <xs:enumeration value="Closed" />
        <xs:enumeration value="CreditOnly" />
        <xs:enumeration value="BudgetOnly" />
        <xs:enumeration value="Frozen" />
        <xs:enumeration value="Reserved" />
        <xs:enumeration value="Cancelled" />
    </xs:restriction>
</xs:simpleType>

普通Java枚举AccountStatus在客户端类中生成。

但是当定义更改为此枚举列表时如下:

<xs:simpleType name="AccountStatus">
    <xs:list>
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:enumeration value="Open"/>
                <xs:enumeration value="Closed"/>
                <xs:enumeration value="CreditOnly"/>
                <xs:enumeration value="BudgetOnly"/>
                <xs:enumeration value="Frozen"/>
                <xs:enumeration value="Reserved" />
                <xs:enumeration value="Cancelled" />
            </xs:restriction>
        </xs:simpleType>
    </xs:list>
</xs:simpleType>

没有为AccountStatus生成枚举类。在应该具有帐户状态列表的对象本身上。目前已经

List<List<String>> statuses 

而不是

List<AccountStatus> statuses 

2 个答案:

答案 0 :(得分:1)

我从第三方供应商Web服务WSDL生成客户端,我无法改变。到目前为止,我找到了使用JAXB Bindings管理我的问题的方法:

<jxb:bindings schemaLocation="../main/resources/META-INF/wsdl/AccountsService.wsdl#types?schema4" node=".//xs:simpleType[@name='AccountStatus']/xs:list/xs:simpleType">
    <jxb:typesafeEnumClass name="AccountStatus">
        <jxb:typesafeEnumMember value="Open" name="Open" />
        <jxb:typesafeEnumMember value="Closed" name="Closed" />
        <jxb:typesafeEnumMember value="CreditOnly" name="CreditOnly" />
        <jxb:typesafeEnumMember value="BudgetOnly" name="BudgetOnly" />
        <jxb:typesafeEnumMember value="Frozen" name="Frozen" />
        <jxb:typesafeEnumMember value="Reserved" name="Reserved" />
        <jxb:typesafeEnumMember value="Cancelled" name="Cancelled" />
    </jxb:typesafeEnumClass>
</jxb:bindings>

编写正确的XPath查询非常重要,结果是:

List<AccountStatus> statuses

在客户端存根类上生成的代码。

答案 1 :(得分:0)

我以前从未使用xs:list,但据我了解,您实际上是将AccountStatus定义为字符串列表。

相反,我会做以下事情:

<xs:simpleType name="AccountStatus">
    <xs:restriction base="xs:string">
        <xs:enumeration value="Open" />
        <xs:enumeration value="Closed" />
        <xs:enumeration value="CreditOnly" />
        <xs:enumeration value="BudgetOnly" />
        <xs:enumeration value="Frozen" />
        <xs:enumeration value="Reserved" />
        <xs:enumeration value="Cancelled" />
    </xs:restriction>
</xs:simpleType>

<xs:complexType name="AccountStatusHolder">
    <xs:sequence>
        <xs:element name="status" type="tns:AccountStatus" maxOccurs="unbounded" />
    </xs:sequence>
</xs:complexType>

注意 maxOccurs =“unbounded”设置,从而产生以下类(生成JAXB):

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "AccountStatusHolder", propOrder = "status")
public class AccountStatusHolder implements Serializable {
    private final static long serialVersionUID = 0L;

    @XmlElement(required = true)
    protected List<AccountStatus> status;
}