Apache CXF với POJO
Trong chương này, bạn sẽ học cách phát triển một ứng dụng web đơn giản để gửi thông điệp chào mừng đến người dùng. Một dự án dịch vụ web sử dụng mô hình WSDL . CXF cho phép bạn ẩn mô hình WSDL này bằng cách cung cấp một giao diện người dùng đơn giản để ánh xạ các API Apache CXF với WSDL bên dưới.
Trong dự án đơn giản nhất này, giao diện của dịch vụ web sẽ được hiển thị trực tiếp với máy khách và máy khách sẽ sử dụng các API Apache CXF bản địa để gọi dịch vụ web.
Đầu tiên, chúng tôi sẽ tạo một dịch vụ web. Mỗi dịch vụ đều có một giao diện được hiển thị cho khách hàng. Chúng tôi có thể viết giao diện này dưới dạng giao diện Apache CXF đơn giản hoặc dưới dạng tài liệu WSDL. Trong cách tiếp cận Apache CXF-First này, chúng tôi sẽ giới thiệu dịch vụ của mình thông qua giao diện Apache CXF.
Phát triển dịch vụ web
Dịch vụ mà chúng tôi sẽ tạo trên web sẽ có một phương thức web duy nhất được gọi là greetings. Phương pháp mất mộtstringnhập đối số mà chúng tôi sẽ gửi tên người dùng. Dịch vụ sẽ gửi lại một tin nhắn chào mừng đến người gọi với tên người dùng đã nhận được bao gồm trong tin nhắn.
Giao diện dịch vụ web
Để hiển thị giao diện của dịch vụ web của chúng tôi, chúng tôi sẽ tạo một giao diện Apache CXF như sau:
//HelloWorld.java
package com.tutorialspoint.cxf.pojo;
public interface HelloWorld {
String greetings(String text);
}
Giao diện chỉ có một phương thức được gọi là greetings. Máy chủ sẽ thực hiện giao diện này. Trong ứng dụng tầm thường của chúng tôi, giao diện này được hiển thị trực tiếp với máy khách. Thông thường, trong ứng dụng dịch vụ web, bạn sử dụng WSDL để mô tả giao diện dịch vụ web. Trong ứng dụng đơn giản này, chúng tôi sẽ cung cấp giao diện trực tiếp này cho nhà phát triển khách hàng. Sau đó, khách hàng sẽ gọigreetingstin nhắn trên đối tượng máy chủ. Vì vậy, trước tiên hãy để chúng tôi tạo dịch vụ web.
Triển khai dịch vụ web
Các HelloWorld giao diện được triển khai trong HelloWorldImpl Lớp Apache CXF như hình dưới đây -
//HelloWorldImpl.java
package com.tutorialspoint.cxf.pojo;
public class HelloWorldImpl implements HelloWorld {
@Override
public String greetings(String text) {
return "Hi " + text;
}
}
Các greetings phương thức nhận một tham số là string gõ, gắn nó vào một tin nhắn chào mừng và trả về chuỗi kết quả cho người gọi.
Tiếp theo, chúng tôi viết ứng dụng máy chủ để lưu trữ HelloWorld dịch vụ.
Tạo máy chủ
Ứng dụng máy chủ bao gồm hai phần:
Phần đầu tiên tạo ra một nhà máy cho dịch vụ web của chúng tôi và
Phần thứ hai viết một main phương pháp khởi tạo nó.
Máy chủ sử dụng ServerFactoryBean lớp được cung cấp bởi các thư viện CXF để hiển thị HelloWorldgiao diện với các máy khách từ xa. Do đó, trước tiên chúng tôi khởi tạoServerFactoryBean và sau đó thiết lập các thuộc tính khác nhau của nó -
ServerFactoryBean factory = new ServerFactoryBean();
Chúng tôi đặt lớp dịch vụ được gọi bằng cách gọi setServiceClass phương pháp trên factory đối tượng -
factory.setServiceClass(HelloWorld.class);
Chúng tôi đặt URL để gọi dịch vụ của mình bằng cách gọi đến nhà máy của setAddressphương pháp. Lưu ý rằng dịch vụ sẽ được xuất bản tại URL này.
factory.setAddress("http://localhost:5000/Hello");
Trong trường hợp này, dịch vụ được triển khai trên máy chủ nhúng và sẽ lắng nghe cổng 5000. Bạn có thể chọn bất kỳ số cổng nào bạn chọn.
Trước khi tạo nhà máy, bạn cần cho nhà máy biết về lớp thực hiện dịch vụ của chúng tôi. Điều này được thực hiện bằng cách gọisetServiceBean phương pháp trên factory đối tượng như được hiển thị ở đây -
factory.setServiceBean(new HelloWorldImpl());
Dịch vụ bean được đặt thành thể hiện của lớp triển khai dịch vụ của chúng tôi. Cuối cùng, chúng tôi tạo nhà máy bằng cách gọicreate phương pháp -
factory.create();
Bây giờ, khi chúng tôi đã phát triển nhà máy để chạy dịch vụ web của mình, tiếp theo chúng tôi sẽ viết main để khởi tạo nó và giữ cho nó chạy trong một thời gian.
Bây giờ, viết một main phương pháp để khởi tạo HelloServer lớp như sau -
public static void main(String[] args) throws Exception {
new HelloServer();
System.out.println("Listening on port 5000 ...");
}
Sau khi được khởi tạo, HelloServerlớp sẽ tiếp tục chạy vô thời hạn. Đối với triển khai sản xuất, bạn chắc chắn sẽ giữ cho máy chủ của mình hoạt động mãi mãi. Trong tình huống hiện tại, chúng tôi sẽ kết thúc máy chủ sau một thời gian định trước như sau:
Thread.sleep(5 * 60 * 1000);
System.out.println("Server exiting ...");
System.exit(0);
Toàn bộ mã cho HelloServer lớp học được đưa ra dưới đây -
//HelloServer.java
//HelloServer.java
package com.tutorialspoint.cxf.pojo;
import org.apache.cxf.frontend.ServerFactoryBean;
public class HelloServer {
protected HelloServer() throws Exception {
ServerFactoryBean factory = new ServerFactoryBean();
factory.setServiceClass(HelloWorld.class);
factory.setAddress("http://localhost:5000/Hello");
factory.setServiceBean(new HelloWorldImpl());
factory.create();
}
public static void main(String[] args) throws Exception {
new HelloServer();
System.out.println("Listening on port 5000 ...");
Thread.sleep(5 * 60 * 1000);
System.out.println("Server exiting ...");
System.exit(0);
}
}
Ứng dụng máy chủ mà chúng tôi đã tạo sử dụng ServerFactoryBeanlớp từ các thư viện CXF. Bây giờ chúng ta phải đưa các thư viện này vào dự án của mình để biên dịch thành côngHelloServerlớp học. Chúng tôi sẽ sử dụngMaven để thiết lập các phụ thuộc của dự án.
Thiết lập dự án Maven
Để tạo một dự án Maven, hãy nhập lệnh sau vào cửa sổ dòng lệnh của bạn. Lưu ý rằng chúng tôi đã thử nghiệm điều này trên máy Mac. Đối với cài đặt Windows và Linux, hướng dẫn có thể khác nhau ở một số điểm.
mvn archetype:generate
Khi được hỏi về các thuộc tính, hãy nhập các giá trị sau:
Define value for property 'groupId': : com.tutorialspoint
Define value for property 'artifactId': : cxf-pojo
Define value for property 'version': 1.0-SNAPSHOT: : 1.0
Define value for property 'package': com.tutorialspoint: : com.tutorialspoint.cxf.pojo
Khi hoàn thành lệnh maven, bạn sẽ tìm thấy cấu trúc thư mục thích hợp được tạo trong thư mục hiện tại của bạn cùng với tệp pom.xml.
Cấu trúc thư mục đã tạo được hiển thị ở đây -
Bạn sẽ thêm các phụ thuộc CXF vào pom.xmlvà cũng sao chép các tệp Apache CXF đã tạo ở trên vào thư mục thích hợp của cấu trúc đã tạo maven. Để bạn có thể tham khảo sẵn sàng, chúng tôi đã cung cấp tệp pom.xml bên dưới cho dự án mà chúng tôi đã tạo trên máy của mình.
<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tutorialspoint</groupId>
<artifactId>cxf-pojo</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<profiles>
<profile>
<id>server</id>
<build>
<defaultGoal>test</defaultGoal>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>java</goal>
</goals>
<configuration>
<mainClass>
com.tutorialspoint.cxf.pojo.HelloServer
</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>client</id>
<build>
<defaultGoal>test</defaultGoal>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>java</goal>
</goals>
<configuration>
<mainClass>
com.tutorialspoint.cxf.pojo.HelloClient
</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<dependencies>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-features-logging</artifactId>
<version>3.3.0</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-simple</artifactId>
<version>3.3.0</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.3.0</version>
</dependency>
<!-- Jetty is needed if you're using the CXFServlet -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.3.0</version>
</dependency>
</dependencies>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
</project>
Pom.xml ở trên có thể bao gồm các phụ thuộc bổ sung không liên quan đến dự án này, nhưng là bắt buộc cho dự án tiếp theo của chúng tôi trong hướng dẫn này. Dù sao, không có hại như vậy trong việc bao gồm các phụ thuộc bổ sung.
Cấu trúc thư mục dự án
Cấu trúc thư mục dự án trên máy của tôi sau khi đặt tệp Apache CXF của máy chủ và máy khách được hiển thị bên dưới để bạn tham khảo nhanh -
Máy chủ đang chạy
Để xây dựng dự án, hãy sử dụng lệnh sau trong cửa sổ dòng lệnh của bạn:
mvn clean install
Bạn có thể khởi động máy chủ bằng lệnh sau:
mvn -Pserver
Thao tác này sẽ khởi động máy chủ và bạn sẽ thấy lời nhắc sau trên bảng điều khiển -
INFO: Creating Service {http://pojo.cxf.tutorialspoint.com/}HelloWorld from class com.tutorialspoint.cxf.pojo.HelloWorld
INFO: Setting the server's publish address to be http://localhost:5000/Hello
Listening on port 5000 ...
Bây giờ, trong cửa sổ trình duyệt của bạn, hãy chỉ định URL của dịch vụ đã xuất bản của chúng tôi. Bạn sẽ thấy kết quả sau:
Điều này xác nhận rằng dịch vụ của chúng tôi đang chạy tại cổng được chỉ định trên máy chủ cục bộ. Vì chúng tôi không chỉ địnhgreetings trong cuộc gọi của chúng tôi, thông báo lỗi SOAP được trả về trình duyệt.
Bạn có thể kiểm tra thêm dịch vụ web của mình bằng ứng dụng khách SOAP mà bạn chọn. Ở đây chúng tôi đã sử dụng Postman để kiểm tra máy chủ của chúng tôi.
Đầu ra như được hiển thị ở đây -
Quan sát điều đó SOAP Requestđã được viết mã bằng tay. Sau khi đăng yêu cầu, máy chủ đã gửiSOAP Response , được hiển thị ở phần dưới cùng của ảnh chụp màn hình.
Từ đó, bạn có thể hiểu rằng CXF duy trì việc sử dụng các giao thức SOAP cho cả yêu cầu và phản hồi trong khi cung cấp cho bạn một cái nhìn thống nhất về nhiều loại công nghệ web đang tồn tại trong thế giới ngày nay. Điều này đơn giản hóa đáng kể việc phát triển ứng dụng web.
Nhiệm vụ tiếp theo của chúng tôi là tạo một ứng dụng khách sẽ sử dụng dịch vụ web mà bạn đã tạo.
Tạo khách hàng
Trong ứng dụng máy chủ HelloWorldlà giao diện hiển thị dịch vụ web của chúng tôi. Bản thân dịch vụ web chỉ cung cấp một thông điệp chào mừng đơn giản cho khách hàng. Thông thường, giao diện dịch vụ web tiếp xúc với thế giới bên ngoài bằng cách sử dụng WSDL (Ngôn ngữ mô tả dịch vụ web). Trong ứng dụng tầm thường này, chúng tôi sẽ hiển thị dịch vụ web của mình cho khách hàng bằng cách hiển thị trực tiếp giao diện dịch vụ và đó làHelloWorld.class.
Với mục đích này, CXF cung cấp một lớp nhà máy được gọi là ClientProxyFactoryBean cho phép chúng tôi đính kèm vào giao diện mong muốn vào phiên bản gốc đã tạo.
Đầu tiên, chúng ta tạo một phiên bản factory bean như sau:
ClientProxyFactoryBean factory = new ClientProxyFactoryBean();
Chúng tôi gọi là setAddresstrên phiên bản factory bean để đặt URL mà dịch vụ web của chúng tôi có thể được gọi. Trong trường hợp của chúng tôi, chúng tôi sẽ sử dụng URL được sử dụng trong khi tạo máy chủ ở bước trước của chúng tôi -
factory.setAddress("http://localhost:5000/Hello");
Tiếp theo, chúng tôi gọi create phương pháp trên factory ví dụ để đính kèm giao diện dịch vụ của chúng tôi HelloWorld.class với nó.
HelloWorld helloServer = factory.create(HelloWorld.class);
Cuối cùng, chúng tôi gọi greetings phương pháp để gọi dịch vụ web từ xa.
System.out.println(helloServer.greetings(System.getProperty("user.name")));
Điều này sẽ in một thông điệp chào mừng trên bảng điều khiển của bạn.
Toàn bộ nguồn cho ứng dụng khách được hiển thị bên dưới:
//HelloClient.java
package com.tutorialspoint.cxf.pojo;
import org.apache.cxf.frontend.ClientProxyFactoryBean;
public class HelloClient {
public static void main(String[] args) throws Exception {
ClientProxyFactoryBean factory = new ClientProxyFactoryBean();
factory.setAddress("http://localhost:5000/Hello");
HelloWorld helloServer = factory.create(HelloWorld.class);
System.out.println(helloServer.greetings(System.getProperty("user.name")));
}
}
Đang chạy khách hàng
Đảm bảo rằng máy chủ vẫn đang chạy trên máy của bạn. Trong trường hợp hết thời gian, hãy khởi động lại máy chủ bằng lệnh sau:
mvn -Pserver
Bạn sẽ thấy thông báo sau trên bảng điều khiển -
Listening on port 5000 ...
Bây giờ, trước khi máy chủ hết thời gian chờ mà chúng tôi đã đặt thành 5 phút, hãy mở một cửa sổ dòng lệnh khác và khởi động máy khách bằng lệnh sau:
mvn -Pclient
Bạn sẽ thấy một thông báo tương tự như sau trên dòng lệnh:
Hi tutorialspoint
Lưu ý rằng tutorialspointlà tên người dùng của chúng tôi. Bạn sẽ nhận được một lời chào với tên của chính bạn.
Trong chương tiếp theo, chúng ta sẽ học cách sử dụng CXF trong dự án JAX-WS (Apache CXF API cho Dịch vụ Web XML).