2012-04-02 3 views
4

Ich habe eine wsdl mit einem eingebetteten xsd.JAXB Bindungen in eingebetteten XSD

<wsdl:definitions name="AcmeService" 
    targetNamespace="http://www.acme.com/services/Acme/WcfService" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:tns="http://www.acme.com/services/Acme/WcfService" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <wsdl:types> 
     <xsd:schema targetNamespace="http://www.acme.com/services/Acme/WcfService/Imports"> 
      <xsd:import schemaLocation="http://services01.acme.com/WebServices/AcmeWcfClient/service/AcmeService.svc?xsd=xsd0" namespace="http://www.acme.com/services/Acme/WcfService" /> 
      <xsd:import schemaLocation="http://services01.acme.com/WebServices/AcmeWcfClient/service/AcmeService.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/" /> 
     </xsd:schema> 
    </wsdl:types> 
    <!-- Some more WSDL Content --> 
</wsdl:definitions> 

Mein 'xsd' enthält folgende Definitionen:

<xs:schema elementFormDefault="qualified" targetNamespace="http://www.acme.com/services/Acme/WcfService"> 
    <xs:element name="SetApplication"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element minOccurs="0" name="application" nillable="true" type="tns:Application"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:complexType name="Application"> 
     <xs:sequence> 
      <xs:element minOccurs="0" name="SomeElement" nillable="true" type="xs:string"/> 
      <xs:element minOccurs="0" name="AnotherElement" nillable="true" type="xs:string"/> 
      <xs:element minOccurs="0" name="AcmeDetails" nillable="true" type="tns:Acme"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:element name="Application" nillable="true" type="tns:Application"/> 
    <xs:complexType name="Acme"> 
     <xs:sequence> 
      <xs:element minOccurs="0" name="PropertyOne" nillable="true" type="xs:string"/> 
      <xs:element minOccurs="0" name="PropertyTwo" nillable="true" type="xs:string"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:element name="Acme" nillable="true" type="tns:Acme"/> 
    <xs:element name="GetAcmeDetails"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element minOccurs="0" name="acme" nillable="true" type="tns:Acme"/> <!-- "acme" name is lowercase on purpose --> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="GetAcmeDetailsResponse"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element minOccurs="0" name="GetAcmeDetailsResult" nillable="true" type="tns:Acme"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

Mein Problem kommt von der Tatsache, dass, wenn die Service-Stubs mit wsimport zu erzeugen, ich mit der folgenden Definition links bin für Acme:

@XmlType(name = "Acme", namespace = "http://www.acme.com/services/Acme/WcfService", propOrder = { 

Das Problem ist, dass ich auf den gleichen Basiswertsowohl Acme und AcmeDetails lösen müssenObjekt.

an ein Paar Suche von anderen, ähnlichen Fragen (here, here und here) Ich habe versucht, eine Bindung mit dem folgende XML zu erstellen:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<jaxws:bindings 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    wsdlLocation="Acme_Service.wsdl"> 
    <enableWrapperStyle>true</enableWrapperStyle> 
    <enableAsyncMapping>false</enableAsyncMapping> 
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:complexType[@name='Application']/xs:sequence/xs:element[@name='AcmeDetails']"> 
     <jaxb:class name="AcmeDetails"/> 
    </jaxws:bindings> 
</jaxws:bindings> 

Die obige Bindung erzeugt die Klasse ‚AcmeDetails‘ aber die XMLType-Anmerkung bleibt "Acme".

Jede Hilfe bei der Erzeugung von Bindungen zu sowohl Acme als auch AcmeDetails in dem obigen Extrakt wurde sehr geschätzt.

Antwort

4

Externe XML-Schema-Dateien durch die WSDL-Datei importiert wird, können eine JAXB externen verbindliche Erklärung Datei angepasst werden:

<jxb:bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" version="1.0"> 
    <jxb:bindings schemaLocation="your-imported-xsd-location" node="/xsd:schema"> 
     <jxb:schemaBindings> 
      <jxb:package name="fromjava.client"/> 
     </jxb:schemaBindings> 
    </jxb:bindings> 
... 
</jxb:bindings> 

Die externe JAXB verbindliche Erklärung Datei übergeben werden kann, um wsimport den -b-Schalter. Details finden Sie in der Dokumentation zu JAX-WS-Tools.

Der obige Auszug kommt von this link; während höchstwahrscheinlich für Ihre Version anwendbar, könnten Sie dasselbe überprüfen;

+0

Danke für die Info. Ich habe diesen Artikel vorher gelesen (ich denke, dass Sie das in einem separaten Post hervorgehoben haben). Das Bit, das ich vielleicht vermisse, ist, dass ich wahrscheinlich meine 'wsdlLocation',' node' und 'schemaLocation' in meiner Bindungsdatei vermische. Ich bin mir ziemlich sicher, dass mein 'XPath' korrekt ist (beide dokumentierten Versuche hätten funktionieren sollen), aber irgendwo in der Mischung von Dingen verstehe ich es falsch. – radimpe

+0

Eigentlich sind dies zwei getrennte Bindungen. Wenn Sie genauer hinsehen, http://java.sun.com/xml/ns/jaxb}bindings, das das Attribut schemaLocation für die externe XSD-Datei hat (siehe XSD [hier] (http: // java. sun.com/xml/ns/jaxb/bindingschema_2_0.xsd)) unterscheidet sich von {http://java.sun.com/xml/ns/jaxws}bindings mit dem Attribut wsdlLocation (siehe Schema [hier] (http://java.sun.com/xml/ns/jaxws/wsdl_customizationschema_2_0.xsd)). Wiederum eine benutzerdefinierte Bindung für XSD, die andere benutzerdefinierte Bindungen für WSDL. –

+0

Ich habe den schema/wsdlocation-Teil meiner bindings.xml aussortiert. Ich habe immer noch das ursprüngliche Problem, dass abhängig von dem Pfad, auf den Sie auf "Acme" zugreifen, entweder eine Zuordnung zu "AcmeDetails" erstellt werden muss oder einfach "Acme" bleiben muss. – radimpe