O WSImport gera XMLTypes conflitantes para vários WSDL do Dynamics CRM 4.0
Atualmente estou trabalhando com o serviço da Web do Dynamics CRM 4.0. A primeira coisa que fiz foi gerar as classes certas com o wsimport paraJava/JAX-WS
com base no WSDL do serviço da Web. Ao gerar as classes, recebi alguns erros:
<code>[ERROR] A class/interface with the same name "com.microsoft.schemas.crm._2007.webservices.RetrieveResponse" is already in use. Use a class customization to resolve this conflict. line 979 of file://src/main/webapp/WEB-INF/classes/META-INF/wsdl/CrmServiceWsdl.wsdl [ERROR] (Relevant to above error) another "RetrieveResponse" is generated from here. line 12274 of file://src/main/webapp/WEB-INF/classes/META-INF/wsdl/CrmServiceWsdl.wsdl </code>
A linha 979 nos diz:
<code><s:element name="RetrieveResponse"> <s:complexType> <s:sequence> <s:element name="RetrieveResult" type="s3:BusinessEntity" /> </s:sequence> </s:complexType> </s:element> </code>
E a linha 12274 nos dá:
<code><s:complexType name="RetrieveResponse"> <s:complexContent mixed="false"> <s:extension base="tns:Response"> <s:sequence> <s:element ref="s3:BusinessEntity" /> </s:sequence> </s:extension> </s:complexContent> </s:complexType> </code>
Ambas as partes estão no mesmo namespace. Ambos serão gerados como RetrieveResponse.class e então eles estão colidindo. Eu encontrei uma solução para este problema que é o arquivo xml de ligação JAX-B:
<code><bindings node="//xsd:complexType[@name='RetrieveResponse']"> <jaxb:class name="RetrieveResponseType"/> </bindings> </code>
Isso funciona (não tenho certeza se esta é a abordagem correta ..?) ..
Então, depois disso, consegui criar algumas chamadas bem-sucedidas para o webservice, o que é ótimo!
Agora vem o problema: algumas entidades de negócios em dinâmica usam a classeLista de escolhas. Esse tipo de entidade pode ser consultado com o serviço de metadados:http://msdn.microsoft.com/pt-br/library/bb890248.aspx
Então, a próxima coisa que fiz foi, novamente, gerar as classes para o serviço de metadados, com base em seu WSDL. O resultado das classes geradas não é como nós exceto. Por exemplo, ele gera uma classe 'com.microsoft.schemas.crm._2007.webservices.ExecuteResponse'. Mas essa classe também existe exatamente no mesmo pacote das classes geradas pelo CrmService. Diferenças entre os dois são:
Metadataservice ExecuteReponse:
<code>@XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "response" }) @XmlRootElement(name = "ExecuteResponse") public class ExecuteResponse { @XmlElement(name = "Response") protected MetadataServiceResponse response; etc... </code>
CrmService ExecuteReponse:
<code>@XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "response" }) @XmlRootElement(name = "ExecuteResponse") public class ExecuteResponse { @XmlElement(name = "Response", required = true) protected ResponseType response; etc... </code>
Agora esta classe é apenas um exemplo (outro exemplo éCrmAuthenticationToken), que é umquase duplicata exata de outra classe. Para poder usar as mesmas classes, adicionei um sufixo de pacote às classes CrmService (exibidas comoprefixo. Então, agora, quando tento chamar o CrmService, recebo a seguinte exceção:
<code>Two classes have the same XML type name "{http://schemas.microsoft.com/crm/2007/CoreTypes}CrmAuthenticationToken". Use @XmlType.name and @XmlType.namespace to assign different names to them. this problem is related to the following location: at com.microsoft.schemas.crm._2007.coretypes.CrmAuthenticationToken at public com.microsoft.schemas.crm._2007.coretypes.CrmAuthenticationToken *prefix*.com.microsoft.schemas.crm._2007.coretypes.ObjectFactory.createCrmAuthenticationToken() at *prefix*.com.microsoft.schemas.crm._2007.coretypes.ObjectFactory this problem is related to the following location: at *prefix*.com.microsoft.schemas.crm._2007.coretypes.CrmAuthenticationToken at public javax.xml.bind.JAXBElement *prefix*.com.microsoft.schemas.crm._2007.webservices.ObjectFactory.createCrmAuthenticationToken(*prefix*.com.microsoft.schemas.crm._2007.coretypes.CrmAuthenticationToken) at *prefix*.com.microsoft.schemas.crm._2007.webservices.ObjectFactory </code>
Eu pessoalmente acho que é estranho eles colocarem classes diferentes com o mesmo nome na mesma estrutura de pacotes. Isso significa que você nunca pode usar os 2 serviços da web ao mesmo tempo.
Isso é uma Microsoft, um bug do WSimport ou apenas um erro estúpido no meu final? Espero que alguém possa me ajudar com esse problema!
Obrigado pelo seu tempo!