WSImport generuje sprzeczne XMLTypes dla wielu WSDL Dynamics CRM 4.0

Obecnie pracuję z usługą internetową Dynamics CRM 4.0. Pierwszą rzeczą, jaką zrobiłem, było wygenerowanie odpowiednich klas za pomocą wsimportJava/JAX-WS na podstawie WSDL usługi internetowej. Podczas generowania klas miałem kilka błędów:

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

Linia 979 mówi nam:

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

A linia 12274 daje nam:

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

Obie części są w tej samej przestrzeni nazw. Oba będą generowane jako RetrieveResponse.class, a więc kolidują. Znalazłem rozwiązanie tego problemu, jakim jest plik xml wiążący JAX-B:

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

To działa (nie jestem pewien, czy jest to poprawne podejście ..?) ..

Więc po tym udało mi się utworzyć kilka udanych połączeń z serwisem internetowym, co jest świetne!

Teraz pojawia się problem: niektóre jednostki biznesowe w dynamice crm używają klasyLista wyboru. Ten typ encji może zostać zapytany o usługę Metadata:http://msdn.microsoft.com/en-us/library/bb890248.aspx

Następną rzeczą, którą zrobiłem, było wygenerowanie klas dla usługi metadanych na podstawie jej WSDL. Wynik wygenerowanych klas nie jest taki, jak my. Na przykład generuje klasę „com.microsoft.schemas.crm._2007.webservices.ExecuteResponse”. Ale ta klasa istnieje również w dokładnie tym samym pakiecie klas generowanych przez CrmService. Różnice między 2 to:

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>

Teraz ta klasa to tylko jeden przykład (innym przykładem jestCrmAuthenticationToken), który jestprawie dokładny duplikat innej klasy. Aby móc korzystać z tych samych klas, dodałem sufiks pakietu do klas CrmService (wyświetlany jakoprefiks.). Teraz, gdy próbuję wywołać CrmService, otrzymuję następujący wyjątek:

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

Osobiście uważam, że to dziwne, że umieszczają różne klasy o tej samej nazwie w tej samej strukturze pakietu. Oznacza to, że nigdy nie możesz używać dwóch serwisów internetowych jednocześnie.

Czy to jest Microsoft, błąd WSimport lub po prostu głupi błąd na moim końcu? Mam nadzieję, że ktoś może mi pomóc z tym problemem!

Dziękuję za Twój czas!

questionAnswers(1)

yourAnswerToTheQuestion