geradora problema Java SABÃO cliente de serviços web com JDK wsimport ferramenta a partir de um WSDL gerado por um aplicativo .NET 2.0
-
16-09-2019 - |
Pergunta
Eu estou tentando gerar um cliente para alguns serviços web SOAP usando a ferramenta wsimport
JDK 6.
O WSDL foi gerado por uma aplicação .NET 2.0. Para aplicações .NET 3.x, ele funciona bem.
Quando eu executo
wsimport -keep -p mypackage http://myservice?wsdl
mostra várias mensagens de erro como este:
[ERROR] Uma classe / interface com o mesmo nome "mypackage.SomeClass" já está em uso. Use uma personalização classe para resolver este conflito. linha ?? de http: // myservice wsdl
Quando eu gerar o cliente de serviços da Web usando Axis 1.4 (usando o plug-in Eclipse WebTools).
Alguém sabe o que posso fazer, a fim de usar a ferramenta wsimport
? Eu realmente não entendo o que a coisa "class personalização" é.
Solução
Eu não sei se isso já foi resolvido, mas eu passei algum tempo pesquisando uma solução para esse mesmo problema.
Eu encontrei uma correção aqui - https: // jax- ws.dev.java.net/issues/show_bug.cgi?id=228
A solução é executar wsimport com o -B-XautoNameResolution
(sem espaços)
Outras dicas
Para quem lê isso usando Maven, este é como adicioná-lo ao arquivo .pom. Observe os argumentos na seção de configuração. Isso não é muito facilmente encontradas na documentação. Muito obrigado a Isaac Stephens por sua ajuda com isso.
<!-- 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>
A resposta aceita acima resolveria seu problema, mas não iria corrigir a causa subjacente.
A questão está acontecendo por causa de uma operação em seu arquivo wsdl tem o mesmo nome de um xsd: complexType em seu arquivo XSD - como no exemplo abaixo. Todos os tipos e as operações devem ter nomes exclusivos.
<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>
Portanto, verifique suas operações e tipos. Certifique-se de que nenhum deles tem o mesmo nome ou seja, há nomes duplicados.
Você está possivelmente gerando todas as classes a partir do arquivo WSDL no mesmo pacote. Se for esse o caso, tente especificar um pacote de destino diferente para cada arquivo WSDL com a opção -p de wsimport.