2017-06-22 20 views
0

.NETで記述されたSOAP WebサービスのWSDLファイルが指定されています。私はJAX-WS(JBossに付属している実装)を使用してJavaクライアントを構築しています。JAX-WS SOAP要求がWSDLファイルと一致しません

私はwsimportを実行してクラスを生成しました。これらを使用してサービスを呼び出すことができます。問題は、JAX-WSが.NETとは異なる方法でWSDLファイルを解釈しているように見えることです。

以下は、WSDLファイルの抜粋です。

<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-生成された要求は次のようになります。興味のある要素がminorgroupsという名前です。 <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がその名前を使用するのが正しいかどうかは分かりません。

JAX-WSは正しく動作するのですか?

答えて

0

あなたの質問に誰も反応しないという事実は、それ自体がヒントです。 :-)

JAX-WSは正しいクラスを生成しています。私は間違ってリクエストを作成していました。

スキーマには、タイプの2つの異なる要素がリストされています。です。 1つはtraffichistoryrequestにネストされ、もう1つはグローバル要素です。

@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); 
} 

注異なる名およびスコープ:

が生成ObjectFactoryクラスは、従って種類minorgrouplistの要素を作成するための2つの類似の方法を有しています。

私は間違ったメソッドを呼び出していましたが、間違ったXMLスコープで正しいJavaタイプのオブジェクトを作成していました。それは明らかにエラーではありませんが、この特定のスキーマでも異なる名前が付けられます。

(悪い要求を生成するのではなく、要素スコープでJAX-WSが実行時健全性チェックをしていないことに少し驚いていますが、それには理由があります)

関連する問題