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!