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!