2017-06-22 4 views
0

Ich habe eine WSDL-Datei eines SOAP-Webdienstes erhalten, der in .NET geschrieben wurde. Ich baue einen Java-Client mit JAX-WS (die Implementierung, die mit JBoss kommt).JAX-WS SOAP-Anfrage stimmt nicht mit WSDL-Datei überein

Ich lief wsimport, um die Klassen zu generieren, und ich kann den Dienst mit ihnen aufrufen. Das Problem ist, dass JAX-WS die WSDL-Datei anders zu interpretieren scheint als .NET.

Hier ist ein Auszug aus der WSDL-Datei. Das Element von Interesse minorgroups genannt:

<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"/> 

Die JAX-WS-generierte Anfrage sieht wie folgt aus. Beachten Sie die <minorgrouplist></minorgrouplist>:

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

Das .NET Service <minorgroups></minorgroups> stattdessen erwartet. Das bekomme ich auch, wenn ich einen Client aus dieser WSDL mit Visual Studio erzeuge.

Ich kann die JAX-WS-Clientanforderung beheben, indem ich die letzte Zeile des WSDL-Snippets bearbeite und das globale Element in minorroups umbenennt. Aber da ich mit XML Schema nicht so vertraut bin, weiß ich nicht, welche Funktion dieses globale Element erfüllt, geschweige denn, ob JAX-WS seinen Namen anstelle des Namens des Elements innerhalb von traffichistoryrequest korrekt verwendet.

Also verhält sich JAX-WS korrekt oder nicht?

Antwort

0

Manchmal ist die Tatsache, dass niemand auf Ihre Frage antwortet, selbst ein Hinweis. :-)

JAX-WS generiert die richtigen Klassen. Ich habe die Anfrage falsch erstellt.

Das Schema listet zwei verschiedene Elemente des Typs minorrouplist auf. Einer ist verschachtelt in traffichistoryrequest und der andere ist ein globales Element.

Die erzeugte ObjectFactory Klasse hat also zwei ähnliche Verfahren für Elemente vom Typ minorgrouplist Schaffung:

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

Hinweis die unterschiedlichen Namen und Scopes.

Beim Erstellen der Anfrage habe ich die falsche Methode aufgerufen, ein Objekt mit dem richtigen Java-Typ, aber im falschen XML-Bereich erstellt. Das ist anscheinend kein Fehler, aber dieses spezielle Schema gibt ihnen auch andere Namen.

(Ich bin ein wenig überrascht, dass JAX-WS hat keine Überprüfung der Laufzeit Gesundheit auf Element Bereiche, anstatt die schlechte Anfrage zu generieren. Aber vielleicht gibt es einen guten Grund dafür.)

Verwandte Themen