Apache CXF พร้อม POJO
ในบทนี้คุณจะได้เรียนรู้วิธีการพัฒนาเว็บแอปพลิเคชันง่ายๆที่ส่งข้อความทักทายไปยังผู้ใช้ โครงการบริการเว็บใช้แบบจำลองWSDL CXF ช่วยให้คุณสามารถซ่อนโมเดล WSDL นี้ได้โดยจัดเตรียมฟรอนต์เอนด์อย่างง่ายเพื่อแมป Apache CXF API กับ WSDL ที่อยู่เบื้องหลัง
ในโครงการที่ง่ายที่สุดนี้อินเทอร์เฟซของบริการเว็บจะถูกเปิดเผยโดยตรงกับไคลเอนต์และไคลเอนต์จะใช้ Apache CXF API ดั้งเดิมเพื่อเรียกใช้บริการเว็บ
ขั้นแรกเราจะสร้างบริการเว็บ ทุกบริการมีอินเทอร์เฟซที่เปิดเผยกับลูกค้า เราอาจเขียนอินเทอร์เฟซนี้เป็นอินเตอร์เฟส Apache CXF ธรรมดาหรือเป็นเอกสาร WSDL ในแนวทาง Apache CXF-First นี้เราจะเปิดเผยบริการของเราผ่านอินเทอร์เฟซ Apache CXF
การพัฒนาบริการเว็บ
บริการที่เรากำลังจะสร้างบนเว็บจะมีวิธีการเว็บเดียวที่เรียกว่า greetings. วิธีนี้ใช้เวลา astringพิมพ์อาร์กิวเมนต์ซึ่งเราจะส่งชื่อผู้ใช้ บริการจะส่งข้อความทักทายกลับไปยังผู้โทรพร้อมชื่อผู้ใช้ที่ได้รับรวมอยู่ในข้อความ
อินเทอร์เฟซบริการเว็บ
ในการเปิดเผยส่วนต่อประสานของบริการบนเว็บของเราเราจะสร้างอินเทอร์เฟซ Apache CXF ดังต่อไปนี้ -
//HelloWorld.java
package com.tutorialspoint.cxf.pojo;
public interface HelloWorld {
String greetings(String text);
}
อินเทอร์เฟซมีเพียงวิธีเดียวที่เรียกว่า greetings. เซิร์ฟเวอร์จะใช้อินเทอร์เฟซนี้ ในแอปพลิเคชันที่ไม่สำคัญของเราอินเทอร์เฟซนี้จะเปิดเผยกับลูกค้าโดยตรง โดยทั่วไปในแอปพลิเคชันบริการบนเว็บคุณจะใช้ WSDL เพื่ออธิบายอินเทอร์เฟซบริการบนเว็บ ในแอปพลิเคชั่นง่ายๆนี้เราจะมอบอินเทอร์เฟซโดยตรงนี้ให้กับนักพัฒนาลูกค้า จากนั้นลูกค้าจะโทรไปที่ไฟล์greetingsข้อความบนวัตถุเซิร์ฟเวอร์ ก่อนอื่นให้เราสร้างบริการเว็บ
การติดตั้งบริการเว็บ
HelloWorld อินเทอร์เฟซถูกนำไปใช้ในไฟล์ HelloWorldImpl คลาส Apache CXF ดังแสดงด้านล่าง -
//HelloWorldImpl.java
package com.tutorialspoint.cxf.pojo;
public class HelloWorldImpl implements HelloWorld {
@Override
public String greetings(String text) {
return "Hi " + text;
}
}
greetings วิธีการรับพารามิเตอร์ของ string พิมพ์ต่อท้ายข้อความทักทายและส่งคืนสตริงผลลัพธ์ไปยังผู้โทร
ต่อไปเราเขียนแอปพลิเคชันเซิร์ฟเวอร์เพื่อโฮสต์ไฟล์ HelloWorld บริการ.
การสร้างเซิร์ฟเวอร์
แอปพลิเคชันเซิร์ฟเวอร์ประกอบด้วยสองส่วน -
ส่วนแรกสร้างโรงงานสำหรับบริการเว็บของเราและ
ส่วนที่สองเขียนไฟล์ main วิธีการสร้างอินสแตนซ์
เซิร์ฟเวอร์ใช้ ServerFactoryBean คลาสที่จัดเตรียมโดยไลบรารี CXF เพื่อแสดงไฟล์ HelloWorldส่วนต่อประสานกับไคลเอนต์ระยะไกล ดังนั้นก่อนอื่นเราจึงสร้างตัวอย่างไฟล์ServerFactoryBean คลาสแล้วตั้งค่าคุณสมบัติต่างๆ -
ServerFactoryBean factory = new ServerFactoryBean();
เราตั้งค่าคลาสบริการที่จะเรียกโดยการโทร setServiceClass วิธีการบน factory วัตถุ -
factory.setServiceClass(HelloWorld.class);
เราตั้งค่า URL สำหรับเรียกใช้บริการของเราโดยโทรไปที่โรงงาน setAddressวิธี. โปรดทราบว่าบริการจะเผยแพร่ที่ URL นี้
factory.setAddress("http://localhost:5000/Hello");
ในกรณีนี้บริการจะถูกปรับใช้บนเซิร์ฟเวอร์แบบฝังและจะรับฟังพอร์ต 5000 คุณสามารถเลือกหมายเลขพอร์ตใดก็ได้ที่คุณต้องการ
ก่อนที่จะสร้างโรงงานคุณต้องแจ้งโรงงานเกี่ยวกับคลาสการใช้บริการของเรา ซึ่งทำได้โดยการเรียกไฟล์setServiceBean วิธีการบน factory วัตถุดังแสดงที่นี่ -
factory.setServiceBean(new HelloWorldImpl());
ถั่วบริการถูกตั้งค่าเป็นอินสแตนซ์ของคลาสการใช้งานบริการของเรา ในที่สุดเราก็สร้างโรงงานโดยเรียกมันว่าcreate วิธีการ -
factory.create();
ในขณะที่เราได้พัฒนาโรงงานเพื่อให้บริการเว็บของเราเราจะเขียนไฟล์ main วิธีการสร้างอินสแตนซ์และทำให้มันทำงานต่อไป
ตอนนี้เขียน main วิธีการสร้างอินสแตนซ์ไฟล์ HelloServer ชั้นเรียนดังนี้ -
public static void main(String[] args) throws Exception {
new HelloServer();
System.out.println("Listening on port 5000 ...");
}
เมื่อสร้างอินสแตนซ์แล้วไฟล์ HelloServerชั้นเรียนจะทำงานไปเรื่อย ๆ สำหรับการใช้งานจริงคุณจะทำให้เซิร์ฟเวอร์ของคุณทำงานตลอดไปอย่างแน่นอน ในสถานการณ์ปัจจุบันเราจะยุติเซิร์ฟเวอร์หลังจากเวลาที่กำหนดไว้ดังนี้ -
Thread.sleep(5 * 60 * 1000);
System.out.println("Server exiting ...");
System.exit(0);
รหัสทั้งหมดสำหรับ HelloServer ชั้นเรียนได้รับด้านล่าง -
//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);
}
}
แอปพลิเคชันเซิร์ฟเวอร์ที่เราสร้างขึ้นใช้ ServerFactoryBeanคลาสจากไลบรารี CXF ตอนนี้เราต้องรวมไลบรารีเหล่านี้ไว้ในโครงการของเราเพื่อรวบรวมไฟล์HelloServerชั้นเรียน เราจะใช้Maven เพื่อตั้งค่าการอ้างอิงโครงการ
การตั้งค่าโครงการ Maven
ในการสร้างโครงการ Maven ให้พิมพ์คำสั่งต่อไปนี้ในหน้าต่างบรรทัดคำสั่งของคุณ โปรดทราบว่าเราได้ทดสอบสิ่งนี้บนเครื่อง Mac สำหรับการติดตั้ง Windows และ Linux คำแนะนำอาจแตกต่างกันในบางที่
mvn archetype:generate
เมื่อถูกถามถึงคุณสมบัติให้ป้อนค่าต่อไปนี้ -
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
เมื่อเสร็จสิ้นคำสั่ง maven คุณจะพบโครงสร้างโฟลเดอร์ที่เหมาะสมที่สร้างขึ้นในโฟลเดอร์ปัจจุบันของคุณพร้อมกับไฟล์ pom.xml
โครงสร้างไดเร็กทอรีที่สร้างขึ้นจะแสดงที่นี่ -
คุณจะเพิ่มการอ้างอิง CXF ในไฟล์ pom.xmlและคัดลอกไฟล์ Apache CXF ที่สร้างไว้ด้านบนไปยังโฟลเดอร์ที่เหมาะสมของโครงสร้างที่สร้างมาเวน สำหรับการอ้างอิงที่พร้อมใช้งานของคุณเราได้ระบุไว้ด้านล่างไฟล์ pom.xml สำหรับโปรเจ็กต์ที่เราสร้างบนเครื่องของเรา
<?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 ข้างต้นอาจมีการอ้างอิงเพิ่มเติมซึ่งไม่เกี่ยวข้องกับโปรเจ็กต์นี้ แต่จำเป็นสำหรับโปรเจ็กต์ถัดไปของเราในบทช่วยสอนนี้ อย่างไรก็ตามไม่มีอันตรายใด ๆ ในการรวมการอ้างอิงเพิ่มเติม
โครงสร้างโฟลเดอร์โครงการ
โครงสร้างโฟลเดอร์โปรเจ็กต์บนเครื่องของฉันหลังจากวางเซิร์ฟเวอร์และไฟล์ Apache CXF ของไคลเอนต์แสดงไว้ด้านล่างสำหรับการอ้างอิงอย่างรวดเร็วของคุณ -
กำลังรันเซิร์ฟเวอร์
ในการสร้างโครงการให้ใช้คำสั่งต่อไปนี้ในหน้าต่างบรรทัดคำสั่งของคุณ -
mvn clean install
คุณสามารถเริ่มเซิร์ฟเวอร์โดยใช้คำสั่งต่อไปนี้ -
mvn -Pserver
สิ่งนี้จะเริ่มต้นเซิร์ฟเวอร์และคุณจะเห็นพร้อมต์ต่อไปนี้บนคอนโซล -
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 ...
ตอนนี้ในหน้าต่างเบราว์เซอร์ของคุณระบุ URL ของบริการที่เผยแพร่ของเรา คุณจะเห็นผลลัพธ์ต่อไปนี้ -
นี่เป็นการยืนยันว่าบริการของเรากำลังทำงานที่พอร์ตที่ระบุบน localhost เนื่องจากเราไม่ได้ระบุไฟล์greetings ข้อความในการโทรของเราข้อความแจ้งข้อผิดพลาด SOAP จะถูกส่งกลับไปยังเบราว์เซอร์
คุณสามารถทดสอบบริการเว็บของคุณเพิ่มเติมโดยใช้ไคลเอนต์ SOAP ที่คุณเลือก ที่นี่เราได้ใช้Postmanเพื่อทดสอบเซิร์ฟเวอร์ของเรา
ผลลัพธ์เป็นดังที่แสดงไว้ที่นี่ -
สังเกตว่า SOAP Requestถูกเข้ารหัสด้วยมือ หลังจากโพสต์คำขอเซิร์ฟเวอร์ส่งไฟล์SOAP Response ข้อความซึ่งจะเห็นในส่วนล่างของภาพหน้าจอ
จากสิ่งนี้คุณสามารถเข้าใจได้ว่า CXF รักษาการใช้โปรโตคอล SOAP สำหรับทั้งคำขอและการตอบกลับในขณะที่ให้มุมมองแบบรวมสำหรับเทคโนโลยีเว็บต่างๆที่มีอยู่ในโลกปัจจุบัน ทำให้การพัฒนาเว็บแอปพลิเคชันง่ายขึ้นอย่างมาก
งานต่อไปของเราคือการสร้างไคลเอนต์ที่จะใช้บริการเว็บที่คุณสร้างขึ้น
การสร้างลูกค้า
ในแอปพลิเคชันเซิร์ฟเวอร์ HelloWorldเป็นอินเทอร์เฟซที่แสดงบริการเว็บของเรา บริการเว็บเองก็แค่ส่งข้อความทักทายธรรมดาให้กับลูกค้า โดยปกติแล้วอินเทอร์เฟซบริการเว็บจะเปิดเผยต่อโลกภายนอกโดยใช้ WSDL (Web Services Description Language) ในแอปพลิเคชันที่ไม่สำคัญนี้เราจะเปิดเผยบริการเว็บของเราให้กับลูกค้าโดยการเปิดเผยอินเทอร์เฟซบริการโดยตรงและนั่นคือHelloWorld.class.
เพื่อจุดประสงค์นี้ CXF จึงจัดเตรียมคลาสโรงงานที่เรียกว่า ClientProxyFactoryBean ที่ช่วยให้เราสามารถเชื่อมต่อกับอินเทอร์เฟซที่ต้องการกับอินสแตนซ์โรงงานที่สร้างขึ้น
ขั้นแรกเราสร้างอินสแตนซ์ของโรงงานถั่วดังนี้ -
ClientProxyFactoryBean factory = new ClientProxyFactoryBean();
เราเรียกว่า setAddressวิธีการบนอินสแตนซ์บีนโรงงานเพื่อตั้งค่า URL ที่สามารถเรียกใช้บริการเว็บของเราได้ ในกรณีของเราเราจะใช้ URL ที่ใช้ในการสร้างเซิร์ฟเวอร์ในขั้นตอนก่อนหน้านี้ -
factory.setAddress("http://localhost:5000/Hello");
ต่อไปเราเรียกว่า create วิธีการบน factory อินสแตนซ์เพื่อแนบอินเทอร์เฟซบริการของเรา HelloWorld.class ไปเลย
HelloWorld helloServer = factory.create(HelloWorld.class);
สุดท้ายเราเรียก greetings วิธีการเรียกใช้บริการเว็บระยะไกล
System.out.println(helloServer.greetings(System.getProperty("user.name")));
สิ่งนี้จะพิมพ์ข้อความทักทายบนคอนโซลของคุณ
แหล่งที่มาทั้งหมดสำหรับแอปพลิเคชันไคลเอนต์แสดงอยู่ด้านล่าง -
//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")));
}
}
กำลังเรียกใช้ไคลเอ็นต์
ตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์ยังคงทำงานอยู่บนเครื่องของคุณ ในกรณีที่หมดเวลาให้รีสตาร์ทเซิร์ฟเวอร์ด้วยคำสั่งต่อไปนี้ -
mvn -Pserver
คุณจะเห็นข้อความต่อไปนี้บนคอนโซล -
Listening on port 5000 ...
ตอนนี้ก่อนที่เซิร์ฟเวอร์จะหมดเวลาซึ่งเราตั้งไว้เป็น 5 นาทีให้เปิดหน้าต่างบรรทัดคำสั่งอื่นและเริ่มไคลเอนต์ด้วยคำสั่งต่อไปนี้ -
mvn -Pclient
คุณจะเห็นข้อความที่คล้ายกับข้อความต่อไปนี้ในบรรทัดคำสั่ง -
Hi tutorialspoint
โปรดทราบว่า tutorialspointคือชื่อผู้ใช้ของเรา คุณจะได้รับคำทักทายด้วยชื่อของคุณเอง
ในบทถัดไปเราจะเรียนรู้วิธีใช้ CXF ในโครงการ JAX-WS (Apache CXF API สำหรับ XML Web Services)