В настоящее время я работаю с веб-службой Dynamics CRM 4.0. Первое, что я сделал, это сгенерировал правильные классы с помощью wsimport для Java/JAX-WS
на основе 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
Строка 979 сообщает нам:
А строка 12274 дает нам:
Обе части находятся в одном и том же пространстве имен. Оба будут сгенерированы как RetrieveResponse.class, поэтому они конфликтуют.Я нашел решение этой проблемы, которое представляет собой XML-файл привязки JAX-B:
Это работает (не уверен, что это правильный подход..?)..
Итак, после этого мне удалось создать несколько успешных вызовов веб-службы, и это здорово!
Теперь возникает проблема: некоторые бизнес-объекты в crm динамики используют класс Picklist. Объекты этого типа можно запросить с помощью службы метаданных: http://msdn.microsoft.com/en-us/library/bb890248.aspx
Следующее, что я сделал, — снова сгенерировал классы. для службы метаданных на основе WSDL. Результат сгенерированных классов не такой, как мы, за исключением. Например, он создает класс «com.microsoft.schemas.crm._2007.webservices.ExecuteResponse». Но этот класс также существует в точно таком же пакете классов, сгенерированных CrmService. Различия между ними следующие:
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...
Теперь этот класс — всего лишь один пример (другой пример — CrmAuthenticationToken), который почти] точная копия другого класса. Чтобы иметь возможность использовать одни и те же классы, я добавил суффикс пакета к классам CrmService (отображается как префикс .). Итак, теперь, когда я пытаюсь вызвать CrmService, я получаю следующее исключение:
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
Лично я считаю странным, что они помещают разные классы с одинаковыми именами в одну и ту же структуру пакета. Это означает, что вы никогда не сможете использовать 2 веб-сервиса одновременно.
Это Microsoft, ошибка WSimport или просто глупая ошибка с моей стороны? Надеюсь, кто-нибудь поможет мне с этой проблемой!
Спасибо за внимание!