2011-11-21 36 views
9

Chúng tôi đang sử dụng cách tiếp cận từ trên xuống cho một dự án với nhiều dịch vụ web (nhiều WSDL). Mỗi dịch vụ web cần phải được thiết lập như một dự án riêng biệt và được triển khai như một cuộc chiến riêng biệt.wsimport - cách tạo các lớp điểm cuối dịch vụ và các lớp JAXB trong các dự án/thư mục riêng biệt

Vấn đề là WSDL chia sẻ một vài tệp .xsd phổ biến. Hiện tại nếu chúng ta chạy wsimport cho mỗi WSDL, thì các lớp JAXB phổ biến đang được nhân đôi trong mỗi dự án dịch vụ web. Lý tưởng nhất là chúng tôi muốn tạo riêng các lớp JAXB trong một dự án chung, và sau đó sử dụng lại các dự án lớp JAXB trong mỗi dự án dịch vụ web, nhưng wsimport không cung cấp tùy chọn bỏ qua thế hệ lớp JAXB HOẶC tới chỉ định một vị trí khác cho các lớp JAXB.

Bất kỳ suy nghĩ nào về cách tôi có thể chia sẻ các lớp JAXB giữa các điểm cuối dịch vụ web JAX-WS khác nhau?

+1

Tôi nghĩ (nhưng tôi có thể sai về điều này) rằng cả hai tùy chọn bạn yêu cầu đều không thể. Không thể bỏ qua thế hệ JAXB vì dịch vụ web phụ thuộc vào các nhánh khác nhau để được tạo. Ngoài ra, đặc tả của thư mục khác nhau sẽ không được một tùy chọn do tất cả các import.My đoán tốt nhất là bạn phải refactor mã cho mình (bằng tay) cho this.But tôi có thể sai. Hãy xem liệu ai đó biết điều này chắc chắn – Cratylus

+0

IDE của bạn là gì? –

+0

@ChrisAldrich Am đang sử dụng IBM RAD 7.5.5 cho dự án này – PrasadB

Trả lời

10

Tôi biết rằng câu hỏi này rất cũ, nhưng tôi muốn chia sẻ câu trả lời cho những người đang tìm kiếm. Tôi biết nó đã cho tôi một thời gian để tìm câu trả lời.

Kể từ JAXB 2.1 RI, có một tính năng được gọi là "tập" mà bạn có thể sử dụng để tạo điều kiện thuận lợi cho việc này.

Giả sử bạn có lược đồ có tên myschema.xsd. Sau đó, bạn sẽ muốn gọi những điều sau:

xjc -episode myschema.episode myschema.xsd 

Điều này cũng hoạt động nếu bạn đang biên soạn nhiều tệp xsd bằng một cuộc gọi. Các cuộc gọi sẽ sản xuất các ràng buộc cũng như các tập tin myschema.episode.

Tệp tập là một tệp kết buộc đặc biệt. Sau đó bạn có thể sử dụng tập tin này với wsimport, như vậy:

wsimport mywsdl.wsdl -b myschema.episode 

wsimport bây giờ sẽ sử dụng các tập tin JAXB tạo ra trước đó, và sẽ tạo ra bất cứ điều gì đó là mất tích.

Xem this page để biết thêm thông tin.

1

Thông thường những gì tôi đã nhìn thấy bằng cách sử dụng Rational công cụ IBM:

Tạo tất cả các lớp JAXB và dịch vụ và lưu trữ chúng với các dự án dịch vụ. Sau đó, tái tạo các lớp JAXB và các máy khách dịch vụ và lưu trữ chúng trong một dự án máy khách.

Có, đây là sự trùng lặp. Nhưng tôi nghĩ lý do đằng sau nó là nó tách biệt mối quan tâm của các nhà cung cấp dịch vụ và người tiêu dùng dịch vụ. Từ góc độ công cụ, làm thế nào để bạn biết nếu máy khách của bạn là .NET, C++ hoặc Java? Hoặc ngược lại. Nếu bạn là một khách hàng, làm thế nào để bạn biết nếu các nhà cung cấp là NET, C++, hoặc Java, vv? Bạn không. Do đó, IBM cung cấp cách tách mối quan tâm này.

Điều ngược lại với điều đó là bạn có mã trùng lặp, nếu bạn tình cờ có nguồn cho cả nhà cung cấp dịch vụ lẫn người tiêu dùng. Điều này có thể là một nỗi đau để duy trì.

Vì vậy, có lẽ tốt nhất là tạo dịch vụ và ứng dụng khách vào một dự án Java (không phải dự án J2EE hoặc dự án web) và tạo ra một cái lọ. Bằng cách này, tất cả các lớp JAXB đều có (và chỉ một lần). WSDL ở đó (một lần). Dịch vụ này có một lần và có thể được triển khai tới máy chủ trong một EAR hoặc WAR. Và khách hàng tồn tại trong trường hợp bạn muốn cung cấp cho ai đó để tiêu thụ dịch vụ của bạn. Nếu khách hàng của bạn cho phép tạo động dựa trên vị trí WSDL, thậm chí tốt hơn.

Tôi có a post that may help bạn với điều đó từ phối cảnh được hướng dẫn. Nó liên quan nhiều hơn đến an ninh, nhưng bạn có thể tìm thấy một số lời khuyên hữu ích từ nó.

4

Bạn có thể thực hiện việc này bằng cách sử dụng tùy chọn JAXB/JAX-WS. Giả sử bạn có các loại XSD được nhúng vào WSDL. Sau đó, tùy biến của bạn sẽ trông giống như:

<jaxws:bindings version="2.0" 
    xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    wsdlLocation="../wsdl/some.wsdl"> 

    <jaxws:package name="org.company.project.ws" /> 

    <!-- XSD types customization within WSDL --> 
    <jaxb:bindings node="//xsd:schema"> 
     <jaxb:schemaBindings> 
      <jaxb:package name="org.company.project.beans" /> 
     </jaxb:schemaBindings> 
    </jaxb:bindings> 
</jaxws:bindings> 

Cấu hình trên ám chỉ cấu trúc thư mục dự án sau:

+-- binding 
| +-- jaxws-binding.xml 
+-- wsdl 
| +-- some.wsdl 
+-- src 
    ... 

Nếu bạn sử dụng org.codehaus.mojo:jaxws-maven-plugin plugin, sau đó bạn cần phải xác định <bindingDirectory>binding</bindingDirectory>.

Trong trường hợp XSD của bạn là bên ngoài để WSDL, sau đó bạn cần phải xác định các tùy chỉnh riêng biệt:

+-- binding 
| +-- jaxb-binding.xml 
| +-- jaxws-binding.xml 
+-- wsdl 
    ... 

Sau đó jaxb-binding.xml sẽ trông giống như:

<jaxb:bindings version="1.0" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

    <jaxb:bindings schemaLocation="my.xsd" node="//xsd:schema"> 
     <jaxb:schemaBindings> 
      <jaxb:package name="org.company.project.beans" /> 
     </jaxb:schemaBindings> 
    </jaxb:bindings> 
</jaxb:bindings> 
  • Đối với xây dựng Ant bạn chỉ cần tạo ra hai lọ cho các gói khác nhau. Khi cá nhân tôi không biết cách nào để tạo hai đồ tạo tác JAR từ một dự án Maven :) thì giải pháp đơn giản nhất là bạn tạo các lớp JAXB từ XSD trong dự án project-beans và trong dự án project-ws xóa các lớp JAXB đã tạo ra sau khi wsimport chạy (bạn có thể sử dụng ant plugin cho điều đó).
+1

Rất hữu ích, đặc biệt là bạn cần một tệp ràng buộc riêng biệt cho một lược đồ đã nhập. Cảm ơn bạn! –