WSImport genera XMLTypes conflictivos para múltiples WSDL de Dynamics CRM 4.0

Actualmente estoy trabajando con el servicio web Dynamics CRM 4.0. Lo primero que hice fue generar las clases correctas con wsimport paraJava/JAX-WS Basado en el WSDL del servicio web. Al generar las clases obtuve algunos errores:

<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>

La línea 979 nos dice:

<code><s:element name="RetrieveResponse">
    <s:complexType>
      <s:sequence>
        <s:element name="RetrieveResult" type="s3:BusinessEntity" />
      </s:sequence>
    </s:complexType>
  </s:element>
</code>

Y la línea 12274 nos da:

<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 partes están en el mismo espacio de nombres. Ambos se generarán como RetrieveResponse.class y por lo tanto están chocando. He encontrado una solución para este problema que es el archivo xml de enlace JAX-B:

<code><bindings node="//xsd:complexType[@name='RetrieveResponse']">
  <jaxb:class name="RetrieveResponseType"/>
</bindings>
</code>

Esto funciona (no estoy seguro si este es el enfoque correcto ..?) ..

Entonces, después de esto, logré crear algunas llamadas exitosas al servicio web, ¡lo cual es genial!

Ahora viene el problema: algunas entidades comerciales en dinámica crm usan la claseLista de selección. Este tipo de entidad se puede consultar con el servicio de metadatos:http://msdn.microsoft.com/en-us/library/bb890248.aspx

Así que lo siguiente que hice fue, nuevamente, generar las clases para el servicio de metadatos, basado en su WSDL. El resultado de las clases generadas no son como nosotros excepto. Por ejemplo, genera una clase 'com.microsoft.schemas.crm._2007.webservices.ExecuteResponse'. Pero esta clase también existe en el mismo paquete exacto de las clases generadas por CrmService. Las diferencias entre los 2 son:

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>

Ahora esta clase es solo un ejemplo (otro ejemplo esCrmAuthenticationToken), el cual es uncasi duplicado exacto de otra clase. Para poder usar las mismas clases, he agregado un sufijo de paquete a las clases de CrmService (que se muestra comoprefijo.). Así que ahora, cuando trato de llamar a CrmService, obtengo la siguiente excepción:

<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>

Personalmente creo que es raro que pongan clases diferentes con el mismo nombre en la misma estructura de paquete. Esto significa que nunca puedes usar los 2 servicios web al mismo tiempo ..

¿Es esto un Microsoft, un error de WSimport o simplemente un error estúpido en mi extremo? Espero que alguien me pueda ayudar con este problema!

¡Gracias por tu tiempo!

Respuestas a la pregunta(1)

Su respuesta a la pregunta