的wsimport产生冲突的XMLTypes多个Dynamics CRM 4.0的WSDL的(WSI

2019-07-29 08:08发布

我目前正在与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的错误或只是一个愚蠢的错误? 希望有人能帮助我解决这个问题!

谢谢你的时间!

Answer 1:

这是微软不一致之处的wsimport是有点难以用结合。

领料单和CRMAuthenticationToken声音,如自定义的数据类型,你会期望这些得到从服务重用服务。 您还会期望某些特定的CRM的实体(比如,客户或商家或地址)即可从服务到服务重用。

这是对的,他们定义不同,这些不同的服务的东西微软方面不礼貌。 这使得它很难接受一个服务的答案,并将其发送到另一个服务。

有服务共享一个或多个共同的模式,你有可能会先使用XJC编译的。 然后,你可能已经提供了一个所谓的插曲文件的wsimport来告诉它使用的,而不是产生新的类。 见地铁指南 。 这是相当一个难题,我可以从经验告诉你,我遇到了错误JAXB-829,XJC忘记生成IF-存在于情节的文件属性。

我会做,我想每个WSDL编译成自己的包,并把生成的类简单的非智能数据传输对象。 如果我想送我刚刚从一个服务中检索到第二个服务的对象,我想两者之间的转换。 如果这会导致非常笨拙的代码,或者如果你想逻辑添加到某些实体,我建议你写你自己的正确的模型类要共享和写入转换器,并从Web服务的DTO对象实体包你想与使用它们。



文章来源: WSImport generates conflicting XMLTypes for multiple Dynamics CRM 4.0 WSDL's