JAX-WS SOAP请求与WSDL文件不匹配

问题描述:

我已经获得了用.NET编写的SOAP Web服务的WSDL文件。我使用JAX-WS(JBoss自带的实现)构建Java客户端。JAX-WS SOAP请求与WSDL文件不匹配

我运行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的行为是否正确?

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

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