2012-05-09 31 views
9
WSDL của WSDL của WSDL

Tôi hiện đang làm việc với dịch vụ web Dynamics CRM 4.0. Điều đầu tiên tôi đã làm, là tạo ra các lớp học phù hợp với wsimport cho Java/JAX-WS dựa trên WSDL của webservice. Trong khi tạo ra các lớp tôi có một số lỗi:WSImport tạo ra các XMLTypes xung đột cho nhiều

[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 

Đường dây 979 cho chúng ta biết:

<s:element name="RetrieveResponse"> 
    <s:complexType> 
     <s:sequence> 
     <s:element name="RetrieveResult" type="s3:BusinessEntity" /> 
     </s:sequence> 
    </s:complexType> 
    </s:element> 

Và dòng 12.274 cho chúng ta:

<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> 

Cả hai bộ phận trong không gian tên tương tự. Cả hai sẽ được tạo ra dưới dạng RetrieveResponse.class và do đó chúng đang va chạm. Tôi đã tìm thấy một giải pháp cho vấn đề này đó là JAX-B ràng buộc tập tin xml:

<bindings node="//xsd:complexType[@name='RetrieveResponse']"> 
    <jaxb:class name="RetrieveResponseType"/> 
</bindings> 

này hoạt động (không chắc chắn nếu điều này là cách tiếp cận đúng ..?) ..

Vì vậy, sau này , Tôi đã quản lý để tạo một số cuộc gọi thành công tới webservice, điều này thật tuyệt vời!

Hiện đã xảy ra sự cố: một số thực thể kinh doanh trong động lực crm sử dụng lớp học Danh sách yêu thích. Loại thực thể này có thể được truy vấn bằng dịch vụ Siêu dữ liệu: http://msdn.microsoft.com/en-us/library/bb890248.aspx

Vì vậy, điều tiếp theo tôi làm là tạo lại các lớp cho dịch vụ siêu dữ liệu dựa trên WSDL của nó. Kết quả của các lớp được tạo ra không phải là chúng ta ngoại trừ. Ví dụ, nó tạo ra một lớp 'com.microsoft.schemas.crm._2007.webservices.ExecuteResponse'. Nhưng lớp này cũng tồn tại trong cùng một gói chính xác của các lớp được tạo ra CrmService. Sự khác biệt giữa 2 là:

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... 

Bây giờ lớp này chỉ là một ví dụ (ví dụ khác là CrmAuthenticationToken), mà là một gần như trùng lặp chính xác của một lớp khác. Để có thể sử dụng cùng một lớp, tôi đã thêm một hậu tố gói vào các lớp CrmService (được hiển thị là tiền tố .). Vì vậy, bây giờ khi tôi cố gắng gọi CrmService, tôi nhận được ngoại lệ sau đây:

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 

Cá nhân tôi nghĩ rằng nó là lạ họ đặt các lớp học khác nhau có cùng tên trong cơ cấu cùng một gói. Điều này có nghĩa là bạn không bao giờ có thể sử dụng 2 dịch vụ web cùng lúc ..

Đây có phải là lỗi Microsoft, một lỗi WSimport hay chỉ là một lỗi ngu ngốc ở cuối của tôi không? Hy vọng ai đó có thể giúp tôi với vấn đề này!

Cảm ơn bạn đã dành thời gian!

Trả lời

1

Đây là sự không nhất quán của Microsoft kết hợp với wsimport hơi khó sử dụng.

Âm thanh PickList và âm thanh CRMAuthenticationToken như các kiểu dữ liệu tùy chỉnh, bạn mong đợi những điều này sẽ được sử dụng lại từ dịch vụ đến dịch vụ. Bạn cũng sẽ mong đợi một số thực thể cụ thể CRM (nói, Khách hàng hoặc Doanh nghiệp hoặc Địa chỉ) để được sử dụng lại từ dịch vụ đến dịch vụ.

Đó là cách cư xử xấu về phía Microsoft về những thứ mà họ xác định những điều này khác nhau cho các dịch vụ khác nhau. Điều này gây khó khăn cho việc trả lời một dịch vụ và gửi nó đến một dịch vụ khác.

Nếu các dịch vụ đã chia sẻ một hoặc nhiều lược đồ chung, bạn có thể đã biên dịch các lược đồ đó trước tiên, bằng cách sử dụng xjc. Sau đó, bạn có thể đã cung cấp một tập tin gọi là tập để wsimport để nói với nó để sử dụng những lớp học thay vì tạo ra những cái mới. Xem the metro guide. Đây là một câu đố khá, tôi có thể nói với bạn từ kinh nghiệm, tôi chạy vào lỗi JAXB-829, xjc quên tạo các thuộc tính nếu tồn tại trong tập tin tập.

Điều tôi muốn làm, tôi sẽ biên dịch từng gói wsdl thành gói riêng của nó và xử lý các lớp được tạo ra như các đối tượng truyền dữ liệu đơn giản không thông minh. Nếu tôi muốn gửi một đối tượng tôi vừa truy xuất từ ​​một dịch vụ sang dịch vụ thứ hai, tôi sẽ chuyển đổi giữa cả hai. Nếu điều này dẫn đến mã khó sử dụng, hoặc nếu bạn muốn thêm logic vào các thực thể nhất định, tôi khuyên bạn nên viết các lớp mô hình thích hợp của riêng bạn cho các Thực thể bạn muốn chia sẻ và viết trình chuyển đổi đến và từ các đối tượng DTO trên web các gói dịch vụ mà bạn muốn sử dụng chúng.

Các vấn đề liên quan