我目前正在与Dynamics CRM 4.0的Web服务的工作。 我做的第一件事,用的wsimport生成正确的类Java/JAX-WS
基于web服务的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行告诉我们:
<s:element name="RetrieveResponse">
<s:complexType>
<s:sequence>
<s:element name="RetrieveResult" type="s3:BusinessEntity" />
</s:sequence>
</s:complexType>
</s:element>
而线12274给我们:
<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>
这两款器件都在同一个命名空间。 双方将作为RetrieveResponse.class生成,所以他们发生碰撞。 我发现这个问题,这是JAX-B结合XML文件的解决方案:
<bindings node="//xsd:complexType[@name='RetrieveResponse']">
<jaxb:class name="RetrieveResponseType"/>
</bindings>
这工作(不知道这是正确的做法..?)..
所以在此之后,我已经成功地创建的Web服务,这是伟大的一些成功的来电!
现在问题来了:在Dynamics CRM中一些商业实体使用类领料单 。 这种类型的实体可以与元数据服务进行查询: http://msdn.microsoft.com/en-us/library/bb890248.aspx
所以我做的下一件事就是,再次产生类的元数据服务的基础上,它的WSDL。 生成的类的结果并不像我们除外。 例如,它产生一个类的com.microsoft.schemas.crm._2007.webservices.ExecuteResponse'。 但是,这个类中也存在完全相同的包CrmService生成的类。 2之间的差异是:
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个web服务的同时..
这是一个微软,在我结束一个wsimport的错误或只是一个愚蠢的错误? 希望有人能帮助我解决这个问题!
谢谢你的时间!