2012-06-13 35 views
7

Tôi đang phát triển WebService với JAX-WS (tôi đang sử dụng mục tiêu wsimport trên jaxws-maven-plugin). Tôi đã viết một WSDL nhập khẩu một lược đồ XSD.lược đồ xsd không được trình bày bởi wsdl

WEB-INF/wsdl/service.wsdl 
WEB-INF/wsdl/service.xsd 

Tôi cũng tạo các lớp dịch vụ web và điểm cuối được tạo và tất cả. Tất cả mọi thứ đã làm việc tuyệt vời cho đến nay. Khi tôi chạy dịch vụ của tôi trên tất cả mọi thứ Tomcat 7 là ok. Tôi có thể truy cập vào một wsdl trong trình duyệt của tôi từ:

http://localhost:8080/webService/servlet-url?wsdl 

nhưng tôi không thể có được quyền truy cập vào một giản đồ XSD. Vấn đề nằm trong wsdl này:

<xsd:schema> 
<xsd:import namespace="http://ws.service/domain/1.0" schemaLocation="service.xsd"/> 
</xsd:schema> 

Tất nhiên trong quá trình tạo lớp wsdl và xsd trên đường dẫn cục bộ nhưng tôi muốn chúng có thể truy cập từ xa khi dịch vụ web đang chạy. Tôi biết rằng schemaLocation nên là một cái gì đó như thế này "http: // localhost: 8080/webService/servlet-url? Xsd = 1".

Trong wsdl trình bày trong nhập khẩu trình duyệt schould trông giống như:

<xsd:schema> 
    <xsd:import namespace="http://ws.service/domain/1.0" schemaLocation="http://localhost:8080/webService/servlet-url?wsdl&resource=service.xsd"/> 
    </xsd:schema> 

localhost: 8080/webservice/servlet wsdl mang lại cho tôi:

wsdl:definitions targetNamespace="http://ws.serv.com/Service/1.0" name="emuiaService">   
<wsdl:types> 
    <xsd:schema> 
     <xsd:import namespace="http://ws.serv.com/Service/domain/1.0" schemaLocation="schema.xsd"/> 
    </xsd:schema> 
</wsdl:types> 
<wsdl:message name="halloMsg"> 
    <wsdl:part name="parameters" element="dom:halloRequest"/> 
</wsdl:message> 
<wsdl:message name="halloResponseMsg"> 
    <wsdl:part name="return" element="dom:halloResponse"/> 
</wsdl:message> 

và vân vân ...

Trả lời

4

Tôi gần như không thể tin rằng đây là một vấn đề khó giải quyết!

Tôi đã googling như điên để tìm một giải pháp cho chính xác vấn đề này! Sau đó, tôi đã đấu tranh thực sự khó khăn để tìm một giải pháp trên của riêng tôi. Bằng cách gỡ lỗi-bước thông qua việc thực thi javax.xml.ws.spi.Provider mặc định của java-6-openjdk ("nhà máy" trong JRE tạo các đối tượng javax.xml.ws.Endpoint mà bạn sử dụng để xuất bản các dịch vụ web) cuối cùng học được một số điều gì đó, mà đã giúp tôi đưa ra một giải pháp mà ít nhất làm việc trong Java SE, ít nhất là trong JRE hiện tại của tôi, đó là:

java version "1.6.0_33" 
OpenJDK Runtime Environment (IcedTea6 1.13.5) (6b33-1.13.5-1ubuntu0.12.04) 
OpenJDK Server VM (build 23.25-b01, mixed mode) 

cho dù giải pháp này là có thể sử dụng trong Java EE tôi không biết chưa.

Dưới đây là cách tôi giải quyết nó:

package myservice; 

import java.io.IOException; 
import java.io.InputStream; 
import java.net.URL; 
import java.util.Arrays; 
import javax.xml.transform.Source; 
import javax.xml.transform.stream.StreamSource; 
import javax.xml.ws.Endpoint; 

public class App 
{ 
    private static final String MY_SERVICE_XSD = "/wsdl/MyService.xsd"; 

    public static void main(String[] args) 
    { 
     Endpoint ep = Endpoint.create(new MyEndpointImpl()); 

     ep.setMetadata(Arrays.asList(sourceFromResource(MY_SERVICE_XSD))); 

     ep.publish("http://localhost:8080/svc/hello"); 
    } 

    private static Source sourceFromResource(String name) { 
     URL resource = App.class.getResource(name); 
     String systemId = resource.toExternalForm(); 
     InputStream inputStream; 
     try { 
      inputStream = resource.openStream(); 
     } catch (IOException e) { 
      throw new RuntimeException("Failed to create InputStream from resource \""+ name +"\"", e); 
     } 
     return new StreamSource(inputStream, systemId); 
    } 
} 

Điều quan trọng là tôi phương pháp sử dụng đầu tiên Endpoint # tạo (không Endpoint # xuất bản) để có được một chưa được công bố Endpoint. Sau đó, tôi thêm tệp XSD dưới dạng "siêu dữ liệu" vào điểm cuối (vẫn chưa được xuất bản) (mã "ep.setMetaData (...)"). Sau đó Tôi xuất bản điểm cuối (mã "ep.publish (...)").

Bây giờ khi tôi truy cập http://localhost:8080/svc/hello?wsdl tôi nhận được:

<definitions targetNamespace="http://somewhere.net/my/namespace" name="MyService"> 
     <types> 
      <xsd:schema> 
       <xsd:import namespace="http://somewhere.net/my/namespace" 
          schemaLocation="http://localhost:8080/svc/hello?xsd=1"/> 
      </xsd:schema> 
     </types> 
        ... 
    </definitions> 

và XSD-file của tôi là có sẵn từ http://localhost:8080/svc/hello?xsd=1!

Lưu ý rằng tập tin MyService.wsdl tôi trên đĩa vẫn còn chứa:

  <xsd:schema> 
       <xsd:import namespace="http://somewhere.net/my/namespace" 
          schemaLocation="MyService.xsd"></xsd:import> 
      </xsd:schema> 
+0

Tôi thực sự không nhớ những gì tôi đã làm ... có thể chuyển sang hợp đồng cuối cùng nhưng cảm ơn bạn đã giải quyết nó. Tôi hy vọng nó sẽ giúp ai đó một ngày nào đó;) – bemol

0

Được rồi, đi thôi.

Into tập tin WSDL để modificate một cái gì đó như thế này

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<wsdl:definitions 
     targetNamespace="http://service.wsr.company.com/" 
     name="webServiceExample" 
     xmlns="http://schemas.xmlsoap.org/wsdl/" 
     xmlns:tns="http://servicio.wsr.baz.com/" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
     xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"> 

On đoạn này ít quan trọng là xmlns thẻ. Những người phục vụ cho việc triển khai XSD lược đồ. Tiếp

<wsdl:types> 
    <xs:schema 
     xmlns:tns="http://service.wsr.company.com/" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     targetNamespace="http://service.wsr.company.com/" version="1.0"> 

     ... 

    </xs:schema> 
</wsdl:types> 

Into những thẻ bên dưới, bạn sẽ nhận được những gì bạn có trong service.xsd tập tin hoặc hiển thị nó trong http://localhost:8080/webService/servlet-url?xsd=1 chúng tôi tiếp tục

<wsdl:message name="your_method_name"> 
     <wsdl:part name="parameters" element="tns:your_method_name"/> 
    </wsdl:message> 
    <wsdl:message name="your_method_nameResponse"> 
     <wsdl:part name="parameters" element="tns:your_method_nameResponse"/> 
    </wsdl:message> 

Những thẻ trên là hiển thị tên phương pháp của bạn. Tiếp theo

<wsdl:portType name="webServiceExample"> 
      <wsdl:operation name="your_method_name"> 
      <wsdl:input message="tns:your_method_name"/> 
       <wsdl:output message="tns:your_method_nameResponse"/> 
      </wsdl:operation> 
    </wsdl:portType> 

Những tar ở trên là để đặt hoạt động của bạn. Tiếp tục

<wsdl:binding name="webServiceExamplePortBinding" type="tns:webServiceExample"> 
     <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> 
     <wsdl:operation name="your_method_name"> 
      <soap:operation soapAction=""/> 
      <wsdl:input> 
       <soap:body use="literal"/> 
      </wsdl:input> 
      <wsdl:output> 
       <soap:body use="literal"/> 
      </wsdl:output> 
     </wsdl:operation> 
    </wsdl:binding> 

Tiếp theo một :)

<wsdl:service name="webServiceExample"> 
    <wsdl:port name="webServiceExamplePort" binding="tns:webServiceExamplePortBinding"> 
     <soap:address location="REPLACE_WITH_ACTUAL_URL"/> 
</wsdl:port> 

Và cuối cùng kết thúc :)

Lưu ý rằng bạn phải thay đổi các thẻ hiện tại bằng thẻ<wsdl:...></wsdl:...>

Bạn lưu nó, công chúng và bạn vui vẻ lược đồ XSD được trình bày trong WSDL.

Tôi hy vọng sẽ giúp bạn. Ciao.

+0

Thật không may điều đó không làm việc. Vẫn còn xsd giản đồ không được trình bày qua http. – bemol

+0

Xin vui lòng, chỉ cho tôi cách bạn làm và cho tôi xem tệp WSDL của bạn. :) – hekomobile

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