web-dev-qa-db-fra.com

Problème de génération de Java SOAP client de services Web avec l'outil JDK wsimport à partir d'un WSDL généré par une application .NET 2.0

J'essaie de générer un client pour certains services Web SOAP à l'aide de l'outil JDK 6 wsimport. Le WSDL a été généré par une application .NET 2.0. Pour les applications .NET 3.X, cela fonctionne bien.

Quand je cours

wsimport -keep -p mypackage http://myservice?wsdl

il affiche plusieurs messages d'erreur comme celui-ci:

[ERREUR] Une classe/interface du même nom "mypackage.SomeClass" est déjà utilisée . Utilisez une personnalisation de classe pour résoudre ce conflit. ligne ?? de http: // myservice? wsdl

Lorsque je génère le client de services Web à l'aide d'Axis 1.4 (à l'aide du plug-in Eclipse WebTools).

Est-ce que quelqu'un sait ce que je peux faire pour utiliser l'outil wsimport? Je ne comprends vraiment pas ce qu'est la "personnalisation de classe".

39
razenha

Je ne sais pas si cela a jamais été résolu, mais j'ai passé un certain temps à chercher du travail sur Google pour trouver une solution à ce même problème.

J'ai trouvé un correctif ici - https://jax-ws.dev.Java.net/issues/show_bug.cgi?id=228

La solution consiste à exécuter wsimport avec le -B-XautoNameResolution (sans espace).

85
PaulH

Pour ceux qui lisent ceci en utilisant maven, voici comment l’ajouter au fichier .pom. Notez les arguments dans la section de configuration. Ce n'est pas très facile à trouver dans la documentation. Merci beaucoup à Isaac Stephens pour son aide à cet égard. 

<!-- definition for ERPStandardWork service -->
<execution>
  <id>ERPStandardWorkService</id>
  <goals>
    <goal>wsimport</goal>
  </goals>
  <configuration>
    <!-- this resolves naming conflicts within the wsdl - there are several copies of fault report objects which clash otherwise. -->
    <args>
       <arg>-B-XautoNameResolution</arg>
    </args>
    <wsdlDirectory>${basedir}/src/main/resources/META-INF/wsdl</wsdlDirectory>
    <wsdlFiles>
        <wsdlFile>ERPStandardWork.wsdl</wsdlFile>
    </wsdlFiles>
      <wsdlLocation>${basedir}/src/main/resources/META-INF/wsdl/ERPStandardWork.wsdl
    </wsdlLocation>
    <staleFile>${project.build.directory}/jaxws/ERPStandardWork/.staleFlag
    </staleFile>
  </configuration>
</execution>
21
Margaret Lydon

Vous générez éventuellement toutes les classes du fichier WSDL dans le même package. Si tel est le cas, essayez de spécifier un package cible différent pour chaque fichier WSDL avec l'option -p de wsimport. 

0
simon

La réponse acceptée ci-dessus résoudrait votre problème mais ne résoudrait pas la cause sous-jacente. 

Le problème se produit car une opération dans votre fichier wsdl a le même nom qu'un xsd: complexType dans votre fichier xsd - comme dans l'exemple ci-dessous. Tous les types et opérations doivent avoir des noms uniques.

<xsd:complexType name="SearchDocuments">
      <xsd:sequence>
        <xsd:element name="document" type="ns0:SearchDocumentById" maxOccurs="unbounded"/>
      </xsd:sequence>
</xsd:complexType>

<operation name="SearchDocuments">
      <input wsam:Action="http://controller.xxx.xxx.com/DocumentWS/searchDocumentsRequest" message="tns:searchDocumentsRequest"/>
      <output wsam:Action="http://controller.xxx.xxx.com/DocumentWS/searchDocumentsResponse" message="tns:searchDocumentsResponse"/>
</operation>

Alors vérifiez vos opérations et types. Assurez-vous qu'aucun d'entre eux n'a le même nom, c'est-à-dire aucun nom en double.

0
Abhi Rampal