如果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
答案 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;
}