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!

questionAnswers(1)

yourAnswerToTheQuestion