2014-09-19 11 views
5

Próbuję wygenerować klienta z Maven i JAXB z pliku WSDL z 2 schematów wewnętrznych i niektórych elementów o tej samej nazwie z różnych schematówDostosowywanie pakietów Java JAXB wsimport

Kiedy próbuję wykonać kompilację I otrzymuję następny błąd:

Two declarations cause a collision in the ObjectFactory class. 

WSDL schematy:

<wsdl:types> 
    <schema targetNamespace="http://ws.services" xmlns="http://www.w3.org/2001/XMLSchema">...</schema> 
    <schema targetNamespace="http://ws.models" xmlns="http://www.w3.org/2001/XMLSchema">...</schema> 
</wsdl:types> 

próbowałem zmiany nazwy elementów, które produkować błąd, ale następnie mój klient wiosny otrzymać prawidłowy komunikat SOAP, ale nie wypełnia prawidłowo obiektu odpowiedzi (wszystkie jego atrybuty są zerowe). Domyślam się, że problem może wynikać z przemianowania klas odpowiedzi, dlatego próbuję generować różne pakiety zachowując oryginalną nazwę wszystkich klas.

W tym celu napisałem następny plik powiązań, ale nie wiem, co robię źle, ponieważ nie działa.

bindings.xml file:

<?xml version="1.0" encoding="UTF-8"?> 
<jaxb:bindings version="2.1" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" > 

<jaxb:bindings schemaLocation="mywsdl.wsdl#types?schema1" 
    node="/xs:schema[@targetNamespace='http://ws.services']"> 
     <jaxb:schemaBindings> 
      <jaxb:package name="package1" /> 
     </jaxb:schemaBindings> 
</jaxb:bindings> 

<jaxb:bindings schemaLocation="mywsdl.wsdl#types?schema2" 
    node="/xs:schema[@targetNamespace='http://ws.models']"> 
     <jaxb:schemaBindings> 
      <jaxb:package name="package2" /> 
     </jaxb:schemaBindings> 
</jaxb:bindings> 

</jaxb:bindings> 

Moja część konfiguracji w pliku maven jest obok, na wszelki wypadek warto:

<groupId>org.jvnet.jax-ws-commons</groupId> 
<artifactId>jaxws-maven-plugin</artifactId> 
<version>2.3</version> 
<executions> 
    <execution> 
     <goals> 
      <goal>wsimport</goal> 
     </goals> 
    </execution> 
</executions> 
<configuration> 
    <wsdlLocation>wsdl/mywsdl.wsdl</wsdlLocation> 
    <wsdlDirectory>src/main/resources/wsdl</wsdlDirectory> 
    <wsdlFiles> 
     <wsdlFile>mywsdl.wsdl</wsdlFile> 
    </wsdlFiles> 
    <bindingDirectory>src/main/resources/wsdl</bindingDirectory> 
    <bindingFiles> 
     <bindingFile>bindings.xml</bindingFile> 
    </bindingFiles> 
    <packageName>original.package</packageName> 
    <sourceDestDir>${basedir}/src/main/java</sourceDestDir> 
</configuration> 

Kiedy skompilować z tego wiązań plików , pojawia się ten sam błąd. Więc myślę, że może to nie jest w porządku.

Czy znalazłeś jakieś błędy?

Dzięki.

+0

Just a wskazówka: można usunąć "bindingFiles" sekcję konfiguracji całkowicie jeśli umieścić wszystkie swoje pliki wiążące w src/JAXWS! Zostaną one następnie automatycznie pobrane przez jaxws-maven-plugin. – headcr4sh

Odpowiedz

7

Z mojego doświadczenia najlepiej jest utworzyć 2 pliki wiążące (po jednym dla każdego pliku WSDL). Aktualizacja pom.xml odpowiednio i upewnij się, że element główny z obowiązującymi plików jest JAXWS: Wiązania (i nie JAXB: Wiązania)

Kilka wskazówek:

  1. upewnij się, aby ustawić poprawnie atrybut "wsdlLocation"! Musi wskazywać plik WSDL, używając względnej ścieżki!
  2. Pakiet jaxws: określa pakiet, który będzie używany dla wygenerowanych klas usług. (rzeczy oznaczone przez @WebService)
  3. Włącz lub wyłącz wrapperStyle i asyncMapping, jak chcesz. ;-)

Przykład wiązania plik dla "package1":

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

    <jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" 
        xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
        xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
        xmlns:xs="http://www.w3.org/2001/XMLSchema" 
        wsdlLocation="mywsdl.wsdl" 
        version="2.0"> 

     <jaxws:package name="package1"/> 
     <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle> 
     <jaxws:enableAsyncMapping>true</jaxws:enableAsyncMapping> 

     <jaxws:bindings node="//wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='http://ws.services']"> 
      <jaxb:schemaBindings> 
       <jaxb:package name="package1"/> 
      </jaxb:schemaBindings> 
     </jaxws:bindings> 

    </jaxws:bindings> 
+1

Bardzo dziękuję !, to wystarczyło. Ważne !, kiedy skompilowałem za pierwszym razem, gdy wtyczka zignorowała moją nową konfigurację pakietu, ponieważ korzystała z poprzedniej z mojego pliku pom, po usunięciu ' original.package' utworzyło różne pakiety. Jednak...Spring nie wypełnia prawidłowo mojego obiektu odpowiedzi i widzę w moim rejestratorze, że komunikat SOAP odpowiedzi jest poprawny, więc to rozwiązanie nie rozwiązało mojego głównego problemu. – maqjav