JAX-WS SOAP 请求与 WSDL 文件不匹配
JAX-WS SOAP request doesn't match WSDL file
我得到了一个用 .NET 编写的 SOAP Web 服务的 WSDL 文件。我正在使用 JAX-WS 构建一个 Java 客户端(JBoss 附带的实现。)
我 运行 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 生成的请求如下所示。注意 <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 片段的最后一行,将该全局元素重命名为 minorgroups 来修复 JAX-WS 客户端请求。但由于不熟悉 XML 架构,我不知道全局元素的功能是什么,更不用说 JAX-WS 使用它的名称而不是 [=29 中的元素名称是否正确了=]流量历史请求.
那么 JAX-WS 的行为是否正确?
有时候没有人回答你的问题本身就是一种暗示。 :-)
JAX-WS 正在生成正确的 classes。我错误地构建了请求。
该架构列出了 minorgrouplist 类型的两个不同元素。一个嵌套在 traffichistoryrequest 中,另一个是全局元素。
生成的 ObjectFactory
class 因此有两个类似的方法来创建 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 没有对元素范围进行运行时健全性检查,而是生成了错误的请求。但也许这是一个很好的理由。)
我得到了一个用 .NET 编写的 SOAP Web 服务的 WSDL 文件。我正在使用 JAX-WS 构建一个 Java 客户端(JBoss 附带的实现。)
我 运行 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 生成的请求如下所示。注意 <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 片段的最后一行,将该全局元素重命名为 minorgroups 来修复 JAX-WS 客户端请求。但由于不熟悉 XML 架构,我不知道全局元素的功能是什么,更不用说 JAX-WS 使用它的名称而不是 [=29 中的元素名称是否正确了=]流量历史请求.
那么 JAX-WS 的行为是否正确?
有时候没有人回答你的问题本身就是一种暗示。 :-)
JAX-WS 正在生成正确的 classes。我错误地构建了请求。
该架构列出了 minorgrouplist 类型的两个不同元素。一个嵌套在 traffichistoryrequest 中,另一个是全局元素。
生成的 ObjectFactory
class 因此有两个类似的方法来创建 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 没有对元素范围进行运行时健全性检查,而是生成了错误的请求。但也许这是一个很好的理由。)