2012-05-09 44 views
9

Aktualnie pracuję z usługą internetową Dynamics CRM 4.0. Pierwszą rzeczą, którą zrobiłem, było wygenerowanie odpowiednich klas z wsimport dla Java/JAX-WS na podstawie WSDL usługi internetowej. Podczas generowania klas mam pewne błędy:WSImport generuje kolidujące typy XMLType dla wielu aplikacji WSDL systemu Dynamics CRM 4.0 WSDL

[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 

Linia 979 mówi nam:

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

i linii 12274 daje nam:

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

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

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

To działa (nie wiem, czy to jest prawidłowe podejście ..?) ..

Więc po tym Udało mi się stworzyć udane połączenia z serwisem internetowym, co jest świetne!

Teraz pojawia się problem: niektóre podmioty gospodarcze w dynamice crm używają klasy Listy wyboru. Ten typ encji można zapytać o usługę metadanych: http://msdn.microsoft.com/en-us/library/bb890248.aspx

Kolejną rzeczą, którą zrobiłem, było wygenerowanie klas dla usługi metadanych, w oparciu o jej WSDL. Wynik wygenerowanych klas nie jest taki, jak my wyjątkiem. Na przykład generuje klasę "com.microsoft.schemas.crm._2007.webservices.ExecuteResponse". Ale ta klasa istnieje również w tym samym pakiecie klas wygenerowanych przez CrmService. Różnice pomiędzy 2 to:

Metadataservice ExecuteReponse:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "response" 
}) 
@XmlRootElement(name = "ExecuteResponse") 
public class ExecuteResponse { 

    @XmlElement(name = "Response") 
    protected MetadataServiceResponse response; 
etc... 

CrmService ExecuteReponse:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "response" 
}) 
@XmlRootElement(name = "ExecuteResponse") 
public class ExecuteResponse { 

    @XmlElement(name = "Response", required = true) 
    protected ResponseType response; 
etc... 

Teraz ta klasa jest tylko jeden przykład (innym przykładem jest CrmAuthenticationToken), który jest prawie dokładny duplikat innej klasy. Aby móc korzystać z tych samych klas, dodałem sufiks pakietu do klas CrmService (wyświetlany jako z prefiksem.). Więc teraz, gdy próbuję wywołać CrmService, pojawia się następujący wyjątek:

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 

Osobiście uważam, że to dziwne włożyli różne klasy o tej samej nazwie w tej samej strukturze pakietu. Oznacza to, że nie można używać dwóch usług sieciowych w tym samym czasie.

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

Dziękujemy za poświęcony czas!

Odpowiedz

1

Jest to niespójność Microsoft w połączeniu z wsimport jest nieco trudne w użyciu.

PickList i CRMAuthenticationToken brzmią jak niestandardowe typy danych, można się spodziewać, że zostaną ponownie wykorzystane z usługi do usługi. Można również oczekiwać, że określone jednostki (np. Klient, firma lub adres) specyficzne dla CRM zostaną ponownie wykorzystane z usługi do usługi.

To jest złe maniery po stronie Microsoftu, które definiują inaczej dla różnych usług. To sprawia, że ​​trudno jest uzyskać odpowiedź jednej usługi i wysłać ją do innej usługi.

Gdyby usługi miały jeden lub więcej wspólnych schematów, mogłeś je skompilować jako pierwsze, używając xjc. Następnie możesz udostępnić tak zwany plik epizodu wsibport, aby poinformować go, aby używał tych klas zamiast generowania nowych. Zobacz the metro guide. To jest dość zagadkowa, mogę powiedzieć z doświadczenia, wpadłem na błąd JAXB-829, xjc zapomniał wygenerować atrybuty if-exist w pliku odcinka.

Co bym zrobił, skompilowałbym każdy plik wsdl do jego własnego pakietu i traktował wygenerowane klasy jako proste nieinteligentne obiekty przenoszenia danych. Jeśli chcę wysłać obiekt, który właśnie został pobrany z jednej usługi do drugiej usługi, dokonam konwersji między oboma. Jeśli spowoduje to strasznie nieporęczny kod lub jeśli chcesz dodać logikę do pewnych elementów, proponuję napisać własne klasy modelu dla jednostek, które chcesz udostępnić i napisać konwertery do iz obiektów DTO w sieci. pakiety usług, z którymi chcesz ich używać.

Powiązane problemy