2013-04-16 35 views
5

Tôi đã tạo một dịch vụ web nhỏ bằng cách sử dụng JAX-WS. Tệp WSDL có phần tử TYPES như thế này.JAX-WS có lược đồ XSD trong URL khác nhau

<types> 
    <xsd:schema> 
    <xsd:import namespace="http://ws.poc.mawia/" schemaLocation="http://localhost:777/ws/hello?xsd=1"/> 
    </xsd:schema> 
</types> 

URL cho dịch vụ web là http://localhost:777/ws/hello?wsdl và XSD là http://localhost:777/ws/hello?xsd=1. Tệp lược đồ XSD ở vị trí khác nhau có định nghĩa kiểu dữ liệu như thế này.

... 
... 
    <xs:complexType name="student"> 
    <xs:sequence> 
    <xs:element name="name" type="xs:string" minOccurs="0"/> 
    <xs:element name="rollNo" type="xs:int"/> 
    </xs:sequence> 
    </xs:complexType> 
    ... 
... 

Hầu hết các tệp WSDL tôi đã thấy thường có các định nghĩa XSD hoàn chỉnh bên trong tệp WSDL nhưng JAX-WS đặt nó ở một vị trí khác.

Đây có phải là cách thức như vậy không? Làm thế nào tôi có thể cấu hình JAX-WS để đặt tất cả các định nghĩa XSD trong một tệp WSDL?

Trả lời

7

Đây có phải là cách như vậy không?

Tách XSD khỏi WSDL là hành vi mặc định trong JAX-WS và bạn không cần phải lo lắng quá nhiều về nó. Các khuôn khổ WS cập nhật (bao gồm WCF) thường có thể xử lý được. Tùy thuộc vào kích thước của XSD, việc nhập nó có thể làm cho WSDL dễ đọc hơn đối với con người. Đối với một dịch vụ web nhỏ, nó chắc chắn sẽ dễ dàng hơn để có một lược đồ nhúng, nhưng nó cũng không phải là quá nhiều của một vấn đề để nhập nó.

Làm cách nào tôi có thể định cấu hình JAX-WS để đặt tất cả các định nghĩa XSD vào một tệp WSDL?

Tôi không biết một cách trực tiếp để làm cho thời gian chạy nhúng các lược đồ trong WSDL, nhưng có một cách giải quyết thông qua đó bạn có thể đạt được điều này:

  1. Publish endpoint của bạn và lưu WSDL và XSD
  2. thủ sao chép nội dung của XSD vào phần types của WSDL và thay thế nhập khẩu schema có
  3. Lưu tập tin WSDL sáp nhập nơi nào đó mà ứng dụng của bạn có thể truy cập vào nó như là một nguồn tài nguyên
  4. Yêu cầu dịch vụ web của bạn tải WSDL đã hợp nhất. Điều này sẽ ngăn chặn các thế hệ năng động tuy nhiên, bạn sẽ phải tự cập nhật các WSDL mỗi khi bạn thực hiện thay đổi đối với giao diện

Bạn có thể thực hiện 4. bằng cách tùy biến các @WebService chú thích. Điều này có thể trông giống như sau:

@WebService(wsdlLocation = "MyWebService.wsdl") 
public class MyWebService { .... } 
+0

MyWebService là một lớp hoặc giao diện? – Mawia

+0

Trong cài đặt tôi có ở đây, đó là một lớp học. 'MyWebService' vẫn thực hiện một giao diện (với chú thích' @ WebService') và trỏ đến giao diện đó với thuộc tính 'endpointInterface'. Aka: '@WebService (endpointInterface =" some.package.MyPortType ", ...)' – joergl

0

Không có gì sai với cách tiếp cận của bạn. WSDL trỏ đến một wsdl khác bằng cách sử dụng URL là tốt.

Nếu bạn không muốn, hãy đề cập đến vị trí wsdl bằng cách sử dụng thuộc tính wsdlLocation của chú thích @WebService. Nhưng một lần nữa với cách tiếp cận này, bạn sẽ phải sửa đổi wsdl bằng tay.

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