WSImport генерирует конфликтующие типы XML для нескольких WSDL Dynamics CRM 4.0
В настоящее время я работаю с веб-сервисом Dynamics CRM 4.0. Первым делом я генерировал правильные классы с помощью wsimport дляJava/JAX-WS
на основе WSDL веб-службы. При создании классов я получил несколько ошибок:
<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>
Строка 979 говорит нам:
<code><s:element name="RetrieveResponse"> <s:complexType> <s:sequence> <s:element name="RetrieveResult" type="s3:BusinessEntity" /> </s:sequence> </s:complexType> </s:element> </code>
И строка 12274 дает нам:
<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>
Обе части находятся в одном пространстве имен. Оба будут сгенерированы как RetrieveResponse.class, и поэтому они сталкиваются. Я нашел решение этой проблемы - XML-файл привязки JAX-B:
<code><bindings node="//xsd:complexType[@name='RetrieveResponse']"> <jaxb:class name="RetrieveResponseType"/> </bindings> </code>
Это работает (не уверен, если это правильный подход ..?) ..
Поэтому после этого мне удалось создать несколько успешных звонков в веб-службу, и это здорово!
Теперь возникает проблема: некоторые бизнес-объекты в динамике crm используют классPicklist, Этот тип объекта может быть запрошен с помощью службы метаданных:http://msdn.microsoft.com/en-us/library/bb890248.aspx
Поэтому следующее, что я сделал, опять-таки - генерация классов для службы метаданных на основе ее WSDL. Результат сгенерированных классов не такой, как мы, кроме. Например, он генерирует класс «com.microsoft.schemas.crm._2007.webservices.ExecuteResponse». Но этот класс также существует в том же пакете сгенерированных классов CrmService. Различия между двумя:
Метадатасервис 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>
Теперь этот класс является лишь одним примером (другой примерCrmAuthenticationToken), который являетсяalmost Точная копия другого класса. Чтобы иметь возможность использовать одни и те же классы, я добавил пакетный суффикс к классам CrmService (отображается какprefix.). So now when I try to call the CrmService, I get the following exception:
<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>
Лично я считаю странным, что разные классы с одинаковыми именами помещают в одну и ту же структуру пакета. Это означает, что вы никогда не сможете использовать 2 веб-сервиса одновременно.
Это Microsoft, ошибка WSimport или просто глупая ошибка в моем конце? Надеюсь, кто-нибудь может помочь мне с этой проблемой!
Спасибо за ваше время!