【问题标题】:JAX-WS SOAP request doesn't match WSDL fileJAX-WS SOAP 请求与 WSDL 文件不匹配
【发布时间】:2017-06-22 20:02:17
【问题描述】:

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

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

这是 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 生成的请求如下所示。注意&lt;minorgrouplist&gt;&lt;/minorgrouplist&gt;

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

.NET 服务需要 &lt;minorgroups&gt;&lt;/minorgroups&gt;。如果我使用 Visual Studio 从这个 WSDL 生成客户端,这也是我得到的。

我可以通过编辑 WSDL sn-p 的最后一行,将全局元素重命名为 minorgroups 来修复 JAX-WS 客户端请求。但是对 XML Schema 不太熟悉,我不知道全局元素正在提供什么功能,更不用说 JAX-WS 使用其名称而不是 traffichistoryrequest中的元素名称是否正确>.

那么 JAX-WS 的行为是否正确?

【问题讨论】:

    标签: jax-ws wsimport


    【解决方案1】:

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

    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 没有对元素范围进行运行时完整性检查,而不是生成错误的请求。但也许有一个很好的理由。)

    【讨论】:

      猜你喜欢
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      • 2023-03-14
      • 1970-01-01
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多