2016-09-26 45 views
5

Tôi đã nhận được WSDL sau đây từ một nhà cung cấp. Dịch vụ mẫu đằng sau nó chạy trên Microsoft .NET. Tôi cần tạo một dịch vụ web bằng Java dựa trên WSDL này.Apache Axis: không chứa phần tử

<?xml version="1.0" encoding="utf-8"?> 
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" 
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" 
xmlns:tns="http://www.somecompany.com/" 
xmlns:s="http://www.w3.org/2001/XMLSchema" 
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" 
targetNamespace="http://www.somecompany.com/" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> 
    <wsdl:types> 
    <s:schema elementFormDefault="qualified" targetNamespace="http://www.somecompany.com/"> 
    <s:import namespace="http://www.w3.org/2001/XMLSchema" schemaLocation="http://www.w3.org/2001/XMLSchema.xsd" /> 
     <s:element name="getInventoryStatus"> 
     <s:complexType> 
      <s:sequence> 
      <s:element minOccurs="0" maxOccurs="1" name="DealerCode" type="s:string" /> 
      <s:element minOccurs="0" maxOccurs="1" name="SupplierCode" type="s:string" /> 
      <s:element minOccurs="0" maxOccurs="1" name="PartNumber" type="s:string" /> 
      <s:element minOccurs="1" maxOccurs="1" name="Quantity" type="s:int" /> 
      <s:element minOccurs="0" maxOccurs="1" name="DeliveryLocation" type="s:string" /> 
      </s:sequence> 
     </s:complexType> 
     </s:element> 
     <s:element name="getInventoryStatusResponse"> 
     <s:complexType> 
      <s:sequence> 
      <s:element minOccurs="0" maxOccurs="1" name="getInventoryStatusResult"> 
       <s:complexType> 
       <s:sequence> 
        <s:element ref="s:schema" /> 
        <s:any /> 
       </s:sequence> 
       </s:complexType> 
      </s:element> 
      </s:sequence> 
     </s:complexType> 
     </s:element> 
    </s:schema> 
    </wsdl:types> 
    <wsdl:message name="getInventoryStatusSoapIn"> 
    <wsdl:part name="parameters" element="tns:getInventoryStatus" /> 
    </wsdl:message> 
    <wsdl:message name="getInventoryStatusSoapOut"> 
    <wsdl:part name="parameters" element="tns:getInventoryStatusResponse" /> 
    </wsdl:message> 
    <wsdl:portType name="InventoryInquirySoap"> 
    <wsdl:operation name="getInventoryStatus"> 
     <wsdl:input message="tns:getInventoryStatusSoapIn" /> 
     <wsdl:output message="tns:getInventoryStatusSoapOut" /> 
    </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="InventoryInquirySoap" type="tns:InventoryInquirySoap"> 
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" /> 
    <wsdl:operation name="getInventoryStatus"> 
     <soap:operation soapAction="http://www.somecompany.com/getInventoryStatus" style="document" /> 
     <wsdl:input> 
     <soap:body use="literal" /> 
     </wsdl:input> 
     <wsdl:output> 
     <soap:body use="literal" /> 
     </wsdl:output> 
    </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:service name="InventoryInquiry"> 
    <wsdl:port name="InventoryInquirySoap" binding="tns:InventoryInquirySoap"> 
     <soap:address location="http://www.somecompany.com/InventoryInquiry.asmx" /> 
    </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

Tôi đổi WSDL tôi nhận được để bao gồm các dòng sau để Eclipse sẽ nhận ra WSDL là hợp lệ:

<s:import namespace="http://www.w3.org/2001/XMLSchema" schemaLocation="http://www.w3.org/2001/XMLSchema.xsd" /> <!-- added for Eclipse--> 

Tôi đã bao gồm tập tin WSDL này trong một mới Dự án Web động. Tôi đã sử dụng trình thủ thuật Dịch vụ Web Mới để tạo một dịch vụ web trên cùng mới dựa trên WSDL.

Khi tôi triển khai các dự án để Tomcat và gọi dịch vụ web, Apache Axis báo cáo lại như sau: lỗi

AXIS

Xin lỗi, một cái gì đó dường như đã đi sai ... đây là những chi tiết:

lỗi - makeTypeElement() được cho biết để tạo ra một loại "{} http://www.somecompany.com/ >> getInventoryStatusResponse> getInventoryStatusResult", với không có yếu tố chứa

AxisFault faultCode: {} http://schemas.xmlsoap.org/soap/envelope/ Server.generalException faultSubcode: faultString: makeTypeElement() được cho biết để tạo ra một loại "{} http://www.somecompany.com/ >> getInventoryStatusResponse> getInventoryStatusResult", với không có yếu tố chứa faultActor: faultNode: faultDetail : {} http://xml.apache.org/axis/ hostname: CHỦ-DELL

các dịch vụ web giới thiệu được cung cấp bởi các nhà cung cấp trả về như sau:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
     <GetInventoryStatusResponse xmlns="http://ctire.aktion.com/"> 
     <GetInventoryStatusResult> 
      <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
       <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> 
        <xs:complexType> 
        <xs:choice minOccurs="0" maxOccurs="unbounded"> 
         <xs:element name="InventoryStatus"> 
          <xs:complexType> 
           <xs:sequence> 
           <xs:element name="InStock" type="xs:int" minOccurs="0"/> 
           <xs:element name="EstDeliveryDate" type="xs:string" minOccurs="0"/> 
           <xs:element name="EstDeliveryTime" type="xs:string" minOccurs="0"/> 
           <xs:element name="DeliveryLocation" type="xs:string" minOccurs="0"/> 
           </xs:sequence> 
          </xs:complexType> 
         </xs:element> 
        </xs:choice> 
        </xs:complexType> 
       </xs:element> 
      </xs:schema> 
      <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> 
       <NewDataSet xmlns=""> 
        <InventoryStatus diffgr:id="InventoryStatus1" msdata:rowOrder="0" diffgr:hasChanges="inserted"> 
        <InStock>36</InStock> 
        <EstDeliveryDate>09/27/2016</EstDeliveryDate> 
        <EstDeliveryTime>12:00 PM</EstDeliveryTime> 
        <DeliveryLocation>883620750</DeliveryLocation> 
        </InventoryStatus> 
       </NewDataSet> 
      </diffgr:diffgram> 
     </GetInventoryStatusResult> 
     </GetInventoryStatusResponse> 
    </soap:Body> 
</soap:Envelope> 

Tôi nghĩ rằng tôi cần phải tham khảo một lược đồ cho NewDataSet trong WSDL, nhưng tôi không chắc chắn làm thế nào để làm điều đó.

Trả lời

0

Bạn có biết soapUI không? Bạn có thể nhập WSDL của bạn và thực hiện một số yêu cầu đối với dịch vụ demo. Chỉ để kiểm tra xem cơ sở hạ tầng của bạn có hoạt động đúng không.

Nếu tất cả mọi thứ dường như làm việc, hãy thử này: Có Java tạo ra các lớp từ WSDL qua "wsimport" lệnh như thế này:

% JAVA_HOME%/bin/wsimport -d [RELATIVE_PATH_FOR_GENERATED_CLASSES] - mã hóa UTF-8 -keep -verbose [RELATIVE_PATH_OF_YOUR_WSDL]

Trong mã của bạn, hãy thử sử dụng các lớp được tạo này và triển khai lại.

Bạn có thể lấy tài liệu hướng dẫn đầy đủ của wsimport từ here

Hy vọng rằng sẽ giúp trong bất kỳ cách nào.

+0

sự khác biệt giữa wsimport là gì và sử dụng Axis, bao gồm ed với Eclipse? –

+0

Vâng, tôi biết soapUI. Như đã lưu ý trong câu hỏi, vấn đề là tôi không thể truy cập dịch vụ mà Axis xây dựng, do một vấn đề với việc chuyển đổi Axis của các lớp WSDL thành các lớp Java. –

+0

Bạn đã thử tạo các tạo phẩm qua wsimport chưa? Công cụ này đã phục vụ tôi nhiều hơn một lần. Kết quả của các công cụ khác - Tôi không thể nhớ mình đã thử nhưng tôi nghĩ AXIS là một trong số chúng - không hoạt động. – actc

0

Bạn nên sử dụng JAX-WS, một tiêu chuẩn Java. Nó hợp tác dễ dàng với JAXB, cũng cần thiết ở đây.

Trong trường hợp này, máy chủ có phản hồi động bao gồm định nghĩa lược đồ và đối tượng miễn phí, nhưng có vẻ như đó là nút diffgram (từ Microsoft XSD) và thể hiện đối tượng tuân thủ định nghĩa XSD trước đó và một số thuộc tính diffgram.

Giải pháp này bỏ qua nút diffgram (nhưng không phải nội dung) vì tôi không có XSD thích hợp từ Microsoft (nó được cho là trong "msdata.xsd từ thư mục Visual Studio% InstallRoot% \ Xml \ Schemas). nó chỉ là một vấn đề đặt XSD đúng và làm theo các bước

bước để tạo ra các dịch vụ:.

  • Tải http://www.apache.org/dyn/closer.lua/cxf/2.7.18/apache-cxf-2.7.18.zip
  • trong Eclipse -> Window -> Preferences -> CXF -> Thêm và sau đó chọn + áp dụng
  • Tạo một dự án Web động và đặt WSDL trong src
  • Dịch vụ
  • Web -> Tạo Java Skeleton -> Runtime CXF -> Finish
  • Đặt trong định nghĩa giản đồ từ phản ứng mẫu trong diffgram-v1.xsd

  • Tạo lớp JAXB trong một dòng lệnh với "XJC diffgram-v1.xsd" (từ java bin classpath)

  • Thay đổi GetInventoryStatusResponse.GetInventoryStatusResult thêm trước khi định nghĩa lớp "@XmlSeeAlso ({NewDataSet .class})" để hỗ trợ trở về đối tượng này thông qua JABX trong dịch vụ
  • Thực hiện InventoryInquirySoapImpl.getInventoryStatus trở XSD phân tích cú pháp và một thể hiện của NewDataSet:

    InventoryStatus ie = new InventoryStatus(); 
        ie.setDeliveryLocation("del"); 
        ie.setInStock(36); 
        ie.setEstDeliveryDate("09/27/2016"); 
        ie.setDeliveryLocation("883620750"); 
    
        NewDataSet nds = new NewDataSet(); 
        nds.getInventoryStatus().add(ie); 
    
        GetInventoryStatusResponse.GetInventoryStatusResult _return = new GetInventoryStatusResponse.GetInventoryStatusResult(); 
    
        _return.setSchema(parseDiffgramSchema()); 
        _return.setAny(nds); 
        return _return; 
    
  • parseDiffgramSchema có thể được thực hiện với JABX:

    // TODO cache 
    URL file = this.getClass().getClassLoader() 
         .getResource("diffgram-v1.xsd"); 
    
    JAXBContext jaxbContext = JAXBContext.newInstance(Schema.class); 
    
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
    
    Schema schema = (Schema) jaxbUnmarshaller.unmarshal(file); 
    
    return schema; 
    

Full dụ trong GIT tôi https://github.com/sergio-otero/TestJAXWS/tree/master/TestJAXWS

+0

Tôi đang sử dụng Axis để tạo dịch vụ web từ WSDL, chứ không phải để tạo ứng dụng khách để gọi dịch vụ hiện có. –

+0

Ok. Tôi có một ví dụ trả về phần "xs: schema" nhưng không trả về phần "diffgram". Tôi sẽ dễ dàng hơn nếu bạn có thể cung cấp msdata.xsd từ thư mục Visual Studio% InstallRoot% \ Xml \ Schemas –

+0

Dịch vụ web .NET thực tế là từ một nhà cung cấp. Tôi đã hỏi họ về lược đồ đó. –

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