WSImport generiert widersprüchliche XML-Typen für mehrere Dynamics CRM 4.0-WSDLs

Ich arbeite derzeit mit dem Dynamics CRM 4.0-Webservice. Als erstes habe ich mit wsimport die richtigen Klassen für generiertJava/JAX-WS basierend auf der WSDL des Webservices. Beim Generieren der Klassen sind einige Fehler aufgetreten:

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

Zeile 979 sagt uns:

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

Und Zeile 12274 gibt uns:

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

Beide Teile befinden sich im selben Namespace. Beide werden als RetrieveResponse.class generiert und kollidieren daher. Ich habe eine Lösung für dieses Problem gefunden, nämlich die JAX-B-Bindungs-XML-Datei:

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

Dies funktioniert (nicht sicher, ob dies der richtige Ansatz ist ..?) ..

Danach habe ich es geschafft, einige erfolgreiche Aufrufe für den Webservice zu erstellen, was großartig ist!

Jetzt kommt das Problem: Einige Geschäftsentitäten in dynamics crm verwenden die KlasseAuswahlliste. Dieser Entitätstyp kann mit dem Metadaten-Service abgefragt werden:http://msdn.microsoft.com/en-us/library/bb890248.aspx

Als nächstes habe ich die Klassen für den Metadaten-Service basierend auf der WSDL generiert. Das Ergebnis der generierten Klassen entspricht nicht unseren Ausnahmen. Beispielsweise wird die Klasse 'com.microsoft.schemas.crm._2007.webservices.ExecuteResponse' generiert. Diese Klasse existiert aber auch im exakt gleichen Paket der von CrmService generierten Klassen. Unterschiede zwischen den 2 sind:

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

Nun ist diese Klasse nur ein Beispiel (ein anderes Beispiel istCrmAuthenticationToken), die einfast genaues Duplikat einer anderen Klasse. Um dieselben Klassen verwenden zu können, habe ich den CrmService-Klassen ein Paketsuffix hinzugefügt (angezeigt alsPräfix.). Wenn ich jetzt versuche, den CrmService aufzurufen, erhalte ich die folgende Ausnahme:

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

Ich persönlich finde es seltsam, dass sie verschiedene Klassen mit demselben Namen in dieselbe Paketstruktur einfügen. Dies bedeutet, dass Sie niemals die beiden Webservices gleichzeitig nutzen können.

Ist das ein Microsoft, ein WSimport-Fehler oder nur ein blöder Fehler an meinem Ende? Hoffe, jemand kann mir bei diesem Problem helfen!

Vielen Dank für Ihre Zeit!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage