Frage

Ich versuche Artefakte für das folgende amazon Wsdl zu generieren:
http://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdl

mit der folgenden Ant-Task:

<taskdef name="wsimport" classname="com.sun.tools.ws.ant.WsImport">
    <classpath>
        <pathelement location="${BUILD_LIBS}/jaxws-ri/lib/jaxws-tools.jar"/>
    </classpath>
</taskdef>

<target name="wsimport" depends="init">
    <delete dir="${generated.src}" />
    <mkdir dir="${generated.src}"/>
    <wsimport
        debug="true"
    keep="true"
    verbose="true"
    destdir="${generated.src}"
    package="com.amazon.webservices.ecs"
    wsdl="wsdl/AWSECommerceService.wsdl"/>
</target>

aber keine Java-Artefakte werden für das folgende Element erzeugt, die wie folgt aussehen:

<xs:element name="Condition">
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:enumeration value="All"/>
            <xs:enumeration value="New"/>
            <xs:enumeration value="Used"/>
            <xs:enumeration value="Collectible"/>
            <xs:enumeration value="Refurbished"/>
       </xs:restriction>
   </xs:simpleType>
</xs:element>

Im Grunde genommen keine Aufzählungen erzeugt werden, obwohl alle anderen Elemente erzeugt werden. Hat jemand dieses Problem gesehen vor? Ich bin mit JAX-WS-ri 2.2.1 http://jax-ws.java.net /2.2.1/
Dank

War es hilfreich?

Lösung

, wie durch Puspendu verwiesen, JAXB Client Anpassung der Bindung ist genau / ziemlich nah an, was Sie brauchen - Sie benötigen eine JAX-WS-Client Anpassung für Ihr Beispiel zu verwenden. JAXB und JAX-WS-Anpassung im Wesentlichen ermöglichen die Definition von Schema-Elementen für WSDL / schema ist zu ergänzen, dass Sie nicht kontrollieren. Es gibt viele verschiedene Dinge, die Sie wie Mapping XML-Elementnamen, um benutzerdefinierte Java-Elemente erreichen kann, die erzeugte API zu ändern, und Ihre Frage zu beantworten, typsichere Enum-Klassen für Elemente zu erzeugen, die mit einem Enum beschränkt sind.

Es gibt zwei Möglichkeiten / Teile zu tun, eine Client-Anpassung für JAX-WS.

1), wenn die WSDL-Importen eine externe Schemadatei 2), wenn der WSDL enthält die gesamte Schema-Definition ohne Importe

Wenn die WSDL-Datei Importen eine externe Schemadatei dann,

im Grunde müssen Sie eine neue Datei erstellen (in der Regel mit einer JXB Erweiterung, aber es ist wirklich egal), dass Sie auf dieser Seite der Wsdl halten entlang finden Sie die Client-Stub / api für generieren. typischerweise nenne ich diese Dateien Schema-Datei-name_clientcustomization.jxb

jedes Mal, wenn Sie eine aktualisierte Wsdl erhalten, sollten Sie überprüfen, ob Ihre JXB-Datei für die WSDL-Datei noch gültig ist. Die größten Dinge, die ich gefunden habe, zu suchen, vor allem mit Enum Einschränkungen werden Wertänderungen begrenzt, Namespace ändert, geben Sie Namensänderungen, etc ..

wird der Inhalt dieser neuen Datei etwas Ähnliches wie folgt aussehen:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<jxb:bindings 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  xmlns:jxb="http://java.sun.com/xml/ns/jaxb"     
  targetNamespace="http://java.sun.com/xml/ns/jaxb" 
   version="1.0">

    <jxb:bindings schemaLocation="NameOfYourSchemaFile.xsd" 
         node="/xsd:schema[@targetNamespace='SCHEMANAMESPACE']">
        <jxb:schemaBindings>
            <jxb:package name="com.amazon.webservices.ecs" />
        </jxb:schemaBindings>

        <jxb:bindings node="xsd:element[@name='Condition']/xsd:simpleType">
            <jxb:typesafeEnumClass name="ConditionEnum" >
                <jxb:typesafeEnumMember value="All" name="ALL" />
                <jxb:typesafeEnumMember value="New" name="NEW" />
                <jxb:typesafeEnumMember value="Used" name="USED" />
                <jxb:typesafeEnumMember value="Collectible" name="COLLECTIBLE" />
                <jxb:typesafeEnumMember value="Refurbished" name="REFURBISHED" />
            </jxb:typesafeEnumClass>
        </jxb:bindings>
         </jxb:bindings>
</jxb:bindings>

Im Wesentlichen diese Datei definiert Augmentation, die auf die referenzierten XSD-Datei getan werden soll. alle Bindungen Elemente in dieser Datei ein Knotenattribut haben, die einen XPath-Ausdruck ist, dass wählt das Schema Element, das Sie erweitern möchten. im Beispiel habe ich keine Namespace oder andere Informationen, damit ich die XPATH angegebene nur das Elements einfache Typdeklaration zu wählen. innerhalb dieser Bindung definieren wir die typesafeenumclass dies die jaxb / wsimport verursacht eine ENUM-Klasse stellen die referenzierten einfache Art zu erzeugen. da es ein anonymer einfacher Typ ist, definieren diese effektiv eine Klasse nur für das referenzierte Element. Die generierte Klasse wird eine ENUM sein, wer memebers vom Attribut „name“ des typesafeEnumMember Element definiert sind.

Diese JXB-Datei verwenden, müssen Sie es in Ihrer Ant-Task verweisen, etwa so:

<wsimport
        debug="true"
    keep="true"
    verbose="true"
    destdir="${generated.src}"
    package="com.amazon.webservices.ecs"
    wsdl="wsdl/AWSECommerceService.wsdl">

    <binding dir="wsdl" includes="*.jxb"/>

</wsimport>

, wenn die WSDL intern das gesamte Schema definiert, dann müssen Sie eine JAX-WS-Anpassungsdatei verwenden. Dieser Fall ist, was entspricht Ihre Frage.

http://jax-ws.java.net/ nonav / 2.1.7 / docs / customizations.html

JAX-WS-Client Anpassung ist sehr ähnlich wie die JAXB Anpassung. Die Idee ist, identisch sind, für den größten Teil wird die JAX-WS Abschnitt der Anpassungsdatei erzeugten Artefakte verändern, die auf WSDL spezifisch verbunden sind, während die eingebettete JAXB Anpassung führt die gleiche Funktion wie eine externe Anpassungsdatei: es ist die erzeugten Objekte ändert basierend für das Schema.

Der große Unterschied ist, dass anstelle dem JAXB Parser sagen, wo die Schemadatei ist, bieten Sie einen verbindlichen Abschnitt dass wählt die Schema-Definition (unter Verwendung von XPath), dass Sie Anpassung an anwenden mögen.

In diesem Beispiel habe ich eigentlich getestet und überprüft eine Enum-Klasse für das Element erzeugen Sie Fragen zu fragen, so dass Sie diese JAX-WS Anpassung Beispiel wörtlich kopieren können.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<jaxws:bindings
        wsdlLocation="AWSECommerceService.wsdl" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    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"
    >

    <jaxws:bindings node="wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='http://webservices.amazon.com/AWSECommerceService/2010-11-01']">
        <jaxb:schemaBindings>
            <jaxb:package name="com.amazon.webservices.ecs"/>
        </jaxb:schemaBindings>


        <jaxb:bindings node="xsd:element[@name='Condition']/xsd:simpleType">
            <jaxb:typesafeEnumClass name="ConditionEnum" >
                <jaxb:typesafeEnumMember value="All" name="ALL" />
                <jaxb:typesafeEnumMember value="New" name="NEW" />
                <jaxb:typesafeEnumMember value="Used" name="USED" />
                <jaxb:typesafeEnumMember value="Collectible" name="COLLECTIBLE" />
                <jaxb:typesafeEnumMember value="Refurbished" name="REFURBISHED" />
            </jaxb:typesafeEnumClass>
        </jaxb:bindings>

    </jaxws:bindings>

</jaxws:bindings>

Sie würden dann diese JAX-WS-Anpassungsdatei auf die gleiche Weise verweisen Sie auf die JXB Datei verweisen würden.

Ich habe das eigenständige JAXB Anpassung Beispiel nicht bestätigen, da ich wirklich enthalten sie nur als Beispiel und als Vorläufer Erklärung für die JAX-WS Anpassung Beispiel.

Die JAX-WS Anpassung Beispiel, das ich eigentlich tat Test / validate gegen die WSDL Sie verbunden sind, so sollten Sie in der Lage sein, es zu benutzenals Ausgangspunkt. Ich habe bemerkt, dass es zahlreiche aufgezählten Einschränkungen in der definierten WSDL sind, so dass ich Sie Aufzählungen für die meisten / alle von ihnen erzeugen wollen würde annehmen werde.

Ich hoffe, das hilft.

Andere Tipps

Verwenden typesafeEnumMember in JAXB-Binding

Ref: http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.5/tutorial/doc/JAXBUsing4.html#wp148439

oder

So etwas wie dieser [hinzugefügt name = "Condition" ]:

<xs:simpleType name="ConditionType">
            <xs:restriction base="xs:string">
                <xs:enumeration value="All"/>
                <xs:enumeration value="New"/>
                <xs:enumeration value="Used"/>
                <xs:enumeration value="Collectible"/>
                <xs:enumeration value="Refurbished"/>
            </xs:restriction>
        </xs:simpleType>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top