2017-07-12 1 views
0

ich erfolgreich Java-Klassen von mehreren Wsdl Endpunkten mit Maven-jaxb2-Plugin zu erzeugen bin zu aktualisieren.Wie XML-TYPE für generierten Stubs

Dies ist eine Ausführung:

   <execution> 
        <id>generateDelta</id> 
        <goals> 
         <goal>generate</goal> 
        </goals> 
        <configuration> 
         <schemaLanguage>WSDL</schemaLanguage> 
         <generatePackage>com.somepackage1</generatePackage> 
         <schemas> 
          <schema> 
           <url> 
            wsdl_url 
           </url> 
          </schema> 
         </schemas> 
        </configuration> 
       </execution> 

Das hier Problem ist, dass ich mehrere Ausführungen aufweisen, wodurch mehr Klassen zu erzeugen, wobei jede Ausführung die Klassen in verschiedenen Paketen zu speichern.

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "Bapiret2", propOrder = {...}) 

Einer der Klasse Babiret2.java in mehr als einem Paket erzeugt wird (so kommt es aus mehreren wdsls)

Wenn ich Ausführen von Code, der diesen Stubs verwendet, in einem Komponententest zum Beispiel I erhalten die folgende Ausnahme:

org.springframework.oxm.UncategorizedMappingException: Unknown JAXB exception; nested exception is com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions 
Two classes have the same XML type name "{urn:sap-com:document:sap:soap:functions:mc-style}Bapiret2". Use @XmlType.name and @XmlType.namespace to assign different names to them. 
    this problem is related to the following location: 
     at com.somepackage1.Bapiret2 
    this problem is related to the following location: 
     at com.somepackage2.Bapiret2 

fand ich einige mögliche Lösungen wie das Hinzufügen in der Konfiguration unter args Tag

-XautoNameResolution 

arg, es hat nicht funktioniert

Ich habe getestet, ob das Ändern des XmlType name -Attributs funktioniert und es tut. Das Hinzufügen von Namespace zu XmlType funktioniert auch.

Das Problem ist, dass ich weiß nicht, wie dies mit Maven hinzuzufügen, wenn die Klassen zu erzeugen

+0

Ich habe getestet, ob das Ändern des XmlType-Namensattributs funktioniert und es tut. Das Hinzufügen von Namespace zu XmlType funktioniert auch. Das Problem ist, dass ich nicht weiß, wie man dies mit Maven beim Generieren der Klassen – aurelius

Antwort

0

Für jede WSDL-URL innerhalb des Konfigurationselement, sollten Sie sowohl schemaDirectory und generatePackage Elemente angeben, die auf Namen anweisen unterscheidet sich von anderen, da schemaDirectory als Nebeneffekt das angegebene Verzeichnis löscht.

+0

ich bekomme die gleichen Ergebnisse – aurelius

+0

@ Aurelius Wenn ich sagte, dass ich nicht glaube, wäre beleidigend! Nur für den Fall alle Elemente in pom.xml posten. – ugo

0

Ihr Problem gehört zu JAXBContext wenn beide Klassen aus verschiedenen Paketen, aber mit dem gleichen Namensraum durch sie bekannt sind. So, es gibt mehrere Dinge, die Sie beachten müssen:

  1. Ist JAXBContext Erstellung in Ihren Händen? Wenn ja - brauchen Sie wirklich beide Klassen im selben JAXBContext? Vielleicht können Sie für jeden Anwendungsfall zwei verschiedene Kontexte verwenden? Ich meine, wenn Bapiret2 verwendet von somepackage1 und von somepackage2.

Wenn es nicht möglich ist:

  1. Sind diese beiden Klassen Bapiret2 aus dem gleichen XSD erzeugt und tatsächliche Struktur ist das gleiche?

    wenn ja - Sie müssen Ihre generierten Pakete Struktur zu überdenken.

    Sie können für alle Ihre wsdl nur eine Bapiret2 Klasse generieren. Es gibt Reihe von Möglichkeiten, in der Regel, dass zu tun, indem das Hinzufügen von zusätzlichen Mapping-Parameter zu Grunde liegenden XJC Compiler wie

    -p {namespace}={package Name} 
    

Überprüfen Sie einfach Dokumentation Plugin, wie das zu tun ... (Anmerkung: es ist eine Nebenwirkung : Im Paket wird erst ab der letzten Ausführung des Plugins eine Klasse sein.

  1. Wenn Bapiret2 XML-Elemente in verschiedenen XSD haben gleichen Namensraum, aber unterschiedliche Struktur (... leider ziemlich häufig Fall, wenn Webservice-Entwickler Hauptzweck der Namespace ungehorsam ...) dann ist ein schlimmster Fall.

In diesem Fall verwende ich erste Lösung oben - verschiedene JAXBContexts

Aber trotzdem gibt es einige im Folgenden Lösung. (Ich habe nie versucht, aber es scheint, wie Menschen sind glücklich mit dieser :-)

getting-the-jaxb-exception-like-two-classes-have-the-same-xml-type-name

extending-jaxb-representing-annotations.html

PS. Manuell (oder durch ein Skript) ändert sich nach der Generierung immer noch die Option ...

+0

[ERROR] Fehler beim Ausführen des Ziels org.jvnet.jaxb2.maven2: maven-jaxb2-plugin: 0.13.1: generate (generateVehicle) im Projekt maven.module: Fehler beim Parsen der Befehlszeile [[-p {namespace} = { Fahrzeug}, -episode, C: \ ... \ Ziel \ generierte-Quellen \ xjc \ META-INF \ Sonne-jaxb.episode]]: unerkannter Parameter -p {Namensraum} = {Fahrzeug} -> [Hilfe 1] – aurelius

+0

-p {Namensraum} = {Fahrzeug} in der Konfiguration Tag – aurelius

+0

nicht so, dass es ein Parameter für xjc Befehlszeile ist. {} bedeutet, dass Sie Ihre tatsächlichen Werte eingeben: zB '-p http: // foo.com/schema/myservice = com.foo.schema.myservice' Verschiedene Maven-Plugins verwenden unterschiedliche Konfigurationen, um es zu setzen und ich bin mir nicht sicher, ob es sich um Maven handelt. jaxb2-plugin, weil ich es für lange Zeit nicht benutzt habe. ... Es scheint wie '' Einstellungen ... – Vadim