JAX-WS SOAP请求与WSDL文件

时间:2017-06-22 20:02:17

标签: jax-ws wsimport

我收到了一个用.NET编写的SOAP Web服务的WSDL文件。我正在使用JAX-WS(JBoss附带的实现)构建Java客户端。

我运行wsimport来生成类,我可以使用它们来调用服务。问题是JAX-WS似乎以不同于.NET的方式解释WSDL文件。

以下是WSDL文件的摘录。感兴趣的元素名为 minorgroups

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:complexType name="traffichistoryrequest">
        <xs:sequence>
            <xs:element name="startmonth" type="xs:string" nillable="true"/>
            <xs:element name="endmonth" type="xs:string" nillable="true" minOccurs="0"/>
            <xs:element name="minorgroups" type="minorgrouplist" nillable="true" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="traffichistoryrequest" type="traffichistoryrequest" nillable="true"/>
    <xs:complexType name="minorgrouplist">
        <xs:sequence>
            <xs:element name="minorgroupcode" type="xs:string" nillable="true" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="minorgrouplist" type="minorgrouplist" nillable="true"/>

JAX-WS生成的请求如下所示。请注意<minorgrouplist></minorgrouplist>

<ns2:request>
    <startmonth>2017-01</startmonth>
    <endmonth>2017-12</endmonth>
    <minorgrouplist>
        <minorgroupcode>group1</minorgroupcode>
        <minorgroupcode>group2</minorgroupcode>
    </minorgrouplist>
</ns2:request>

.NET服务期待<minorgroups></minorgroups>。如果我使用Visual Studio从这个WSDL生成客户端,那也是我得到的。

我可以通过编辑WSDL片段的最后一行来修复JAX-WS客户端请求,将该全局元素重命名为 minorgroups 。但是不熟悉XML Schema,我不知道全局元素正在服务什么函数,更不用说JAX-WS是否正确使用其名称而不是 traffichistoryrequest

JAX-WS的行为是否正确?

1 个答案:

答案 0 :(得分:0)

有时,没有人回答你的问题这一事实本身就是一个暗示。 : - )

JAX-WS正在生成正确的类。我正在错误地构建请求。

模式列出了 minorgrouplist 类型的两个不同元素。一个嵌套在 traffichistoryrequest 中,另一个是全局元素。

生成的ObjectFactory类因此有两种类似的方法来创建 minorgrouplist 类型的元素:

@XmlElementDecl(namespace = "", name = "minorgrouplist")
public JAXBElement<Minorgrouplist> createMinorgrouplist(Minorgrouplist value) {
    return new JAXBElement<Minorgrouplist>(_Minorgrouplist_QNAME, Minorgrouplist.class, null, value);
}

@XmlElementDecl(namespace = "", name = "minorgroups", scope = Traffichistoryrequest.class)
public JAXBElement<Minorgrouplist> createTraffichistoryrequestMinorgroups(Minorgrouplist value) {
    return new JAXBElement<Minorgrouplist>(_Minorgroups_QNAME, Minorgrouplist.class, Traffichistoryrequest.class, value);
}

请注意不同的名称和范围。

构建请求时,我调用了错误的方法,创建了一个具有正确Java类型但在XML范围错误的对象。这本身并不是一个错误,但这个特殊的模式也赋予它们不同的名称。

(我有点惊讶JAX-WS没有对元素范围进行运行时健全性检查,而不是生成错误的请求。但也许有充分的理由。)