Các dịch vụ Web Java: JAXB và JAX-WS trong Axis2 Sử dụng các công nghệ tiêu chuẩn Java JAXB 2.x và JAX-WS 2.x cho các dịch vụ Web Axis2 pps

32 595 0
Các dịch vụ Web Java: JAXB và JAX-WS trong Axis2 Sử dụng các công nghệ tiêu chuẩn Java JAXB 2.x và JAX-WS 2.x cho các dịch vụ Web Axis2 pps

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Các dịch vụ Web Java: JAXB và JAX-WS trong Axis2 Sử dụng các công nghệ tiêu chuẩn Java JAXB 2.x và JAX-WS 2.x cho các dịch vụ Web Axis2 Dennis Sosnoski, Nhà tư vấn, Sosnoski Software Solutions, Inc. Tóm tắt: Apache Axis2 hỗ trợ một loạt các công nghệ liên kết dữ liệu, bao gồm tiêu chuẩn Java™ chính thức JAXB 2.x . Axis2 cũng hỗ trợ tiêu chuẩn Java cho cấu hình dịch vụ Web, JAX-WS 2.x, như là một sự thay thế cho kỹ thuật cấu hình tùy chỉnh riêng của nó. Dennis Sosnoski tiếp tục loạt bài Các dịch vụ Web Java của mình bằng cách giải thích bạn có thể sử dụng mỗi tiêu chuẩn Java này với Axis2 như thế nào và thảo luận về một số hạn chế về sự hỗ trợ hiện tại của Axis2 cho chúng. Axis của Apache ban đầu đã dựa vào các tiêu chuẩn Java đầu tiên cho các dịch vụ Web, JAX-RPC. Điều này hóa ra không phải là một cách tiếp cận tốt, vì JAX-RPC đã hạn chế việc thiết kế nội bộ của mã Axis và đã góp phần gây ra cả vấn đề hiệu năng lẫn sự thiếu linh hoạt. JAX-RPC cũng đặt một số giả định về hướng phát triển các dịch vụ Web mà sau này hóa ra là sai. Vào lúc mà các nỗ lực phát triển Axis2 đã bắt đầu, một sự thay thế cho JAX-RPC đã có trong các sản phẩm, vì thế Axis2 đã được thiết kế linh hoạt đủ để thực hiện sự hỗ trợ cho tiêu chuẩn của các dịch vụ Web thay thế bên trên đỉnh của khung công tác cơ sở. Các phiên bản mới đây của Axis2 đã triển khai sự hỗ trợ cho cả tiêu chuẩn liên kết dữ liệu XML Java JAXB 2.x lẫn tiêu chuẩn các dịch vụ Web Java JAX-WS 2.x thay thế cho JAX-RPC. Bài viết này cho thấy cách sử dụng JAXB và JAX-WS với Axis2 và nhận biết một số hạn chế về sự hỗ trợ hiện tại của Axis2 cho các tiêu chuẩn này. JAXB trong Axis2 Axis2 thực hiện hỗ trợ cho JAXB 2.x như là một trong những sự lựa chọn liên kết dữ liệu mà bạn có thể chọn khi sinh mã từ một định nghĩa vụ dịch vụ WSDL (Web Services Description Language –Ngôn ngữ mô tả các dịch vụ Web) bằng công cụ WSDL2Java. (Xem "Java Web Services: Axis2 Data Binding" (Các dịch vụ Web: Liên kết dữ liệu Axis2) để đọc về cuộc thảo luận các sự lựa chọn thay thế chủ yếu khác). Như với hầu hết các lựa chọn thay thế khác, việc tạo mã từ WSDL khi sử dụng JAXB 2.x tạo ra cả một tập các lớp liên kết và một tập các lớp mô hình dữ liệu. Các lớp liên kết, bao gồm một gốc phía máy khách và một máy thu thông báo phía máy chủ, giao diện giữa mã ứng dụng của bạn và Axis2. Các lớp mô hình dữ liệu biểu diễn dữ liệu thông báo thực tế. JAXB 2.x sử dụng các chú thích trong các lớp mô hình dữ liệu để kiểm soát cách biến đổi dữ liệu thành XML và từ XML. Cách tiếp cận dùng chú thích cho phép bạn sử dụng các triển khai thực hiện JAXB khác nhau trong thời gian chạy mà không cần phải thay đổi mã nguồn của bạn hoặc biên dịch lại các lớp của bạn. Chính việc triển khai thực hiện JAXB có trách nhiệm truy cập thông tin chú thích từ các lớp mô hình dữ liệu và áp dụng các chú thích này khi biến đổi dữ liệu thành XML và từ XML. Phần tải mã (xem Tải về) cung cấp một ứng dụng ví dụ để giải thích cách sử dụng JAXB trong Axis2, trong thư mục jaxb. Ứng dụng này là một phiên bản khác của dịch vụ quản lý thư viện đơn giản đã sử dụng trong các bài viết trước thuộc loạt bài này (bao gồm việc so sánh liên kết dữ liệu trong "Axis2 Data Binding" (Liên kết dữ liệu Axis2). Định nghĩa dịch vụ WSDL xác định bốn hoạt động:  getBook để lấy ra các chi tiết về một cuốn sách cụ thể được xác định theo Số hiệu sách tiêu chuẩn quốc tế (International Standard Book Number- ISBN).  getBooksByType để lấy ra các chi tiết cho tất cả các cuốn sách của một kiểu cụ thể.  getTypes để tìm các kiểu của các cuốn sách có sẵn.  addBook để thêm một cuốn sách mới vào thư viện. Liệt kê 1 cho thấy một phiên bản WSDL đã biên tập lại nhiều, chỉ gồm các phần liên quan đến hoạt động getBook: Liệt kê 1. WSDL của dịch vụ thư viện <wsdl:definitions targetNamespace="http://ws.sosnoski.com/library/wsdl" xmlns:wns="http://ws.sosnoski.com/library/wsdl" xmlns:tns="http://ws.sosnoski.com/library/types" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"> <wsdl:types> <schema elementFormDefault="qualified" targetNamespace="http://ws.sosnoski.com/library/wsdl" xmlns="http://www.w3.org/2001/XMLSchema"> <import namespace="http://ws.sosnoski.com/library/types" schemaLocation="types.xsd"/> <element name="getBook"> <complexType> <sequence> <element name="isbn" type="string"/> </sequence> </complexType> </element> <element name="getBookResponse"> <complexType> <sequence> <element name="getBookReturn" minOccurs="0" type="tns:BookInformation"/> </sequence> </complexType> </element> </schema> </wsdl:types> <wsdl:message name="getBookRequest"> <wsdl:part element="wns:getBook" name="parameters"/> </wsdl:message> <wsdl:message name="getBookResponse"> <wsdl:part element="wns:getBookResponse" name="parameters"/> </wsdl:message> <wsdl:portType name="Library"> <wsdl:operation name="getBook"> <wsdl:input message="wns:getBookRequest" name="getBookRequest"/> <wsdl:output message="wns:getBookResponse" name="getBookResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="LibrarySoapBinding" type="wns:Library"> <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="getBook"> <wsdlsoap:operation soapAction="urn:getBook"/> <wsdl:input name="getBookRequest"> <wsdlsoap:body use="literal"/> </wsdl:input> <wsdl:output name="getBookResponse"> <wsdlsoap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="jaxb-library"> <wsdl:port binding="wns:LibrarySoapBinding" name="library"> <wsdlsoap:address location="http://localhost:8080/axis2/services/jaxb- library"/> </wsdl:port> </wsdl:service> </wsdl:definitions> Sự hỗ trợ JAXB của Axis2 được giả định sẽ mở rộng để tạo ra các phương thức hoạt động không được bao bọc (ở đây các giá trị được bao bọc trong một thông báo sẽ được chuyển đổi thành các tham số phương thức để thuận tiện cho việc lập trình — xem lại "Các dịch vụ Web: Liên kết dữ liệu Axis2" để đọc các thảo luận về giao diện được bao bọc so với không được bao bọc). Nhưng sự hỗ trợ không được bao bọc sử dụng công cụ WSDL2Java không làm việc với ví dụ này cả trong mã Axis2 hiện tại lẫn trong một số các bản phát hành gần đây. Ít nhất cho đến nay, các phương thức hoạt động có bao bọc là cách duy nhất để sử dụng JAXB với việc tạo mã Axis2 (nhưng hãy xem thảo luận JAX-WS, sắp tới đây, để thấy một cách tiếp cận thay thế). Với giao diện hoạt động có bao bọc, mỗi phương thức dịch vụ cần chỉ một tham số đối tượng khớp với thông báo đầu vào cho hoạt động này và trả về một đối tượng khớp với thông báo đầu ra cho hoạt động này. Các mã đã được cung cấp một sự triển khai thực hiện thực tế của cả dịch vụ lẫn một máy khách thử nghiệm, thiết lập để làm việc với các lớp được tạo ra bằng cách chạy WSDL2Java. Như với đoạn mã ví dụ cho các bài viết trước trong loạt bài này, phần tải về bao gồm các tệp build.properties và build.xml được sử dụng để xây dựng ví dụ này bằng Ant của Apache (trong thư mục jaxb). Trước tiên, bạn cần phải chỉnh sửa tệp build.properties để thiết lập đường dẫn đến bản cài đặt Axis2 của bạn (và thay đổi các giá trị cài đặt khác, nếu cần thiết cho hệ thống của bạn). Sau đó, bạn có thể gõ nhập ant vào một cửa sổ dòng lệnh mở trong thư mục jaxb để chạy WSDL2Java, biên dịch cả mã được cung cấp lẫn mã được tạo ra và xây dựng tệp AAR để triển khai máy chủ. Để thử nghiệm nó, đầu tiên triển khai tệp AAR được tạo ra tới bản cài đặt máy chủ Axis2 của bạn và sau đó gõ ant run trên bàn điều khiển. Cách sử dụng JAXB phía máy khách Máy khách thử nghiệm tạo ra một cá thể của gốc dịch vụ bằng cách sử dụng các tham số điểm đầu cuối dịch vụ được chuyển vào dưới dạng các đối số dòng lệnh và sau đó thi hành một chuỗi năm cuộc gọi dịch vụ: 1. Lấy thông tin cho một cuốn sách. 2. Lấy các kiểu của các cuốn sách trong thư viện. 3. Thêm một cuốn sách vào thư viện (sẽ thất bại nếu cuốn sách đã có mặt, như sẽ xảy ra khi máy khách chạy nhiều hơn một lần mà không khởi động lại máy chủ). 4. Nếu bước cuối cùng đã thành công, cố gắng thêm một cuốn sách khác với cùng một ISBN (phải luôn luôn thất bại). 5. Lấy thông tin về tất cả các cuốn sách của một kiểu cụ thể. Liệt kê 2 cho thấy toàn bộ mã máy khách thử nghiệm. Bạn có thể thấy bản chất có bao bọc của giao diện dịch vụ trong các đối tượng của trình bao bọc (wrapper) được sử dụng cho từng hoạt động, ví dụ như là đối tượng GetTypes đã yêu cầu một cuộc gọi đến hoạt động getTypes (mặc dù không có dữ liệu đầu vào nào cho hoạt động này) và đối tượng GetTypesResponse được cuộc gọi này trả về. Liệt kê 2. Mã máy khách thử nghiệm JAXB public class WebServiceClient { public static void main(String[] args) throws Exception { // check for required command line parameters if (args.length < 3) { System.out.println("Usage:\n java " + "com.sosnoski.ws.library.jaxb.WebServiceClient host port path"); System.exit(1); } // create the client stub String target = "http://" + args[0] + ":" + args[1] + args[2]; System.out.println("Connecting to " + target); JaxbLibraryStub stub = new JaxbLibraryStub(target); // retrieve a book directly String isbn = "0061020052"; GetBook gb = new GetBook(); gb.setIsbn(isbn); GetBookResponse gbr = stub.getBook(gb); BookInformation book = gbr.getGetBookReturn(); if (book == null) { System.out.println("No book found with ISBN '" + isbn + '\''); } else { System.out.println("Retrieved '" + book.getTitle() + '\''); } // retrieve the list of types defined GetTypesResponse gtr = stub.getTypes(new GetTypes()); List<TypeInformation> types = gtr.getGetTypesReturn(); System.out.println("Retrieved " + types.size() + " types:"); for (int i = 0; i < types.size(); i++) { TypeInformation type = types.get(i); System.out.println(" '" + type.getName() + "' with " + type.getCount() + " books"); } // add a new book String title = "The Dragon Never Sleeps"; isbn = "0445203498"; try { AddBook ab = new AddBook(); ab.setType("scifi"); ab.setIsbn(isbn); ab.getAuthor().add("Cook, Glen"); ab.setTitle(title); stub.addBook(ab); System.out.println("Added '" + title + '\''); title = "This Should Not Work"; ab.setTitle(title); stub.addBook(ab); System.out.println("Added duplicate book - should not happen!"); } catch (AddDuplicateFault e) { System.out.println("Failed adding '" + title + "' with ISBN '" + isbn + "' - matches existing title '" + e.getFaultMessage().getBook().getTitle() + '\''); } // get all books of a type GetBooksByType gbbt = new GetBooksByType(); gbbt.setType("scifi"); GetBooksByTypeResponse gbbtr = stub.getBooksByType(gbbt); List<BookInformation> books = gbbtr.getGetBooksByTypeReturn(); [...]... việc sử dụng WSDL 2Java, nhưng có một số hạn chế lớn Sử dụng JAX-WS trong Axis2 Trong khi JAXB có thể được sử dụng như là một kỹ thuật liên kết dữ liệu thay thế khác cho Axis2, thì JAX-WS có những điểm khác biệt sâu sắc hơn nhiều JAXWS là một cách tiếp cận khác hoàn toàn để định nghĩa các dịch vụ Web và nó hoàn toàn thay thế cấu hình phía máy chủ và phía máy khách của Axis2 tiêu chuẩn Bạn tạo mã JAX-WS. .. thấy những điều cơ bản của việc sử dụng các tiêu chuẩn Java JAXB 2.x và JAX-WS 2.x với Axis2 Sự hỗ trợ JAXB trong Axis2 có một số hạn chế, nhưng ít nhất với các lược đồ đơn giản không yêu cầu các tùy chỉnh nó cung cấp một thay thế có ích cho các cách tiếp cận liên kết dữ liệu khác mà Axis2 hỗ trợ Sự hỗ trợ JAX-WS bị hạn chế nhiều hơn và hiện tại chỉ có ích với các dịch vụ đơn giản không đòi hỏi WS-Security... đoạn mã trong Liệt kê 7 chỉ là một phiên bản không được bao bọc của phiên bản (được bao bọc) được hiển thị trong ví dụ JAXB trong Liệt kê 3 Các vấn đề JAX-WS trong Axis2 Axis2 làm việc rất tốt ở các điểm cơ bản về xử lý JAX-WS, nhưng nó có một số hạn chế Đáng kể nhất là thiếu sự hỗ trợ cho WS-Security hoặc các công nghệ mở rộng các dịch vụ Web khác khi bạn sử dụng JAX-WS trong Axis2 (mặc dù các máy... chức năng giá trị gia tăng nào khác Cho đến nay các bài viết trong loạt bài này đã tập trung vào khung công tác Axis2 của Apache Trình bày về JAXB và JAX-WS đã tạo ra một điểm xuất phát tuyệt vời để xem xét một số các khung công tác các dịch vụ Web Java mã nguồn mở khác cũng hỗ trợ các tiêu chuẩn này Bài viết tháng tới sẽ xem xét làm việc với khung công tác Các dịch vụ Web Metro được Sun phát triển kết... từ WSDL bằng cách sử dụng công cụ WsImport của JAX-WS, bạn nhận được một mô hình dữ liệu và các lớp trình bao bọc JAXB giống như khi bạn sử dụng WSDL 2Java cho việc tạo mã JAXB Các sự khác biệt ở trong mã liên kết, mã này trong trường hợp của JAX-WS bao gồm một giao diện dịch vụ được tạo ra và một lớp của trình xây dựng dịch vụ (service-builder) của phía máy khách Lớp giao diện, hiển thị trong Liệt kê... @XmlAttribute được sử dụng với các giá trị (như là các trường hay như là các phương thức thuộc tính JavaBean) để cung cấp tên phần tử hoặc thuộc tính và các đặc điểm khác Tất cả các chú thích được JAXB sử dụng có trong gói javax.xml.bind.annotation, bao gồm các chú thích khác ngoài những chú thích được sử dụng trong mã đã sinh ra cho ví dụ đơn giản này JAXB hỗ trợ cả việc tạo mã từ các lược đồ, giống như trong. .. dụng JAX-WS trong Axis2 Mã của nó nằm trong thư mục jaxws của phần tải về này và nó có WSDL, build.properties và build.xml riêng của mình WSDL cho phiên bản JAX-WS này về cơ bản giống như phiên bản đã sử dụng cho JAXB, được hiển thị trong Liệt kê 1 Sự khác biệt chính trong WSDL là nó sử dụng một lược đồ nhúng cho dữ liệu ứng dụng, không làm việc được với WSDL 2Java khi sử dụng liên kết dữ liệu JAXB. .. rsp; } } "Các ứng dụng Web Java: liên kết dữ liệu Axis2" không cho thấy các mã giao diện máy chủ cho các liên kết dữ liệu khác nhau trong bài viết ấy, nhưng nếu bạn so sánh Liệt kê 3 với các phần tải mã thực tế từ bài viết đó, bạn sẽ thấy rằng nó ăn khớp hoàn toàn với các ví dụ về bao bọc ADB và JiBX, một lần nữa sự khác biệt chỉ do việc sử dụng các danh sách định kiểu Java 5 thay cho các mảng Các lớp... các máy chủ ứng dụng đã xây dựng xung quanh Axis2 có thể thực hiện cách cấu hình và sử dụng WS-Security riêng của chúng) Đây là một hạn chế nghiêm trọng cho các ứng dụng doanh nghiệp và không có bất kỳ các lợi thế bù trừ nào, ngoại trừ một cách tiếp cận cấu hình đơn giản hơn một chút, và đó có vẻ không phải là lý do để sử dụng JAX-WS trong Axis2 ở thời điểm hiện nay Tiến lên từ Axis2 Trong bài viết... Liệt kê 2 với các ví dụ mã máy khách trong "Các ứng dụng Web Java: Liên kết dữ liệu Axis2, " bạn sẽ thấy rằng nó rất giống với các ví dụ bao bọc về JiBX và liên kết dữ liệu Axis (ADB), khác biệt chủ yếu là các lớp bao bọc JAXB sử dụng các danh sách định kiểu Java 5 chứ không phải là các mảng (một lựa chọn thay thế cũng được liên kết dữ liệu JiBX hỗ trợ, nhưng ADB không hỗ trợ) Cách sử dụng phía máy . Các dịch vụ Web Java: JAXB và JAX-WS trong Axis2 Sử dụng các công nghệ tiêu chuẩn Java JAXB 2. x và JAX-WS 2. x cho các dịch vụ Web Axis2 Dennis Sosnoski, Nhà tư vấn,. 2. x lẫn tiêu chuẩn các dịch vụ Web Java JAX-WS 2. x thay thế cho JAX-RPC. Bài viết này cho thấy cách sử dụng JAXB và JAX-WS với Axis2 và nhận biết một số hạn chế về sự hỗ trợ hiện tại của Axis2. tắt: Apache Axis2 hỗ trợ một loạt các công nghệ liên kết dữ liệu, bao gồm tiêu chuẩn Java chính thức JAXB 2. x . Axis2 cũng hỗ trợ tiêu chuẩn Java cho cấu hình dịch vụ Web, JAX-WS 2. x, như là

Ngày đăng: 07/08/2014, 10:22

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan