Apache CXF พร้อม JAX-WS
ในแอปพลิเคชัน JAX-WS นี้เราจะใช้ Apache CXF-first approach เหมือนกับแอปพลิเคชัน POJO รุ่นก่อนหน้า ก่อนอื่นเราจะสร้างอินเทอร์เฟซสำหรับบริการเว็บของเรา
การประกาศอินเทอร์เฟซบริการ
เช่นเดียวกับในกรณีก่อนหน้านี้เราจะสร้างบริการเล็กน้อยที่มีวิธีการติดต่อเพียงวิธีเดียวที่เรียกว่าการทักทาย รหัสสำหรับอินเทอร์เฟซบริการแสดงอยู่ด้านล่าง -
//HelloWorld.java
package com.tutorialspoint.cxf.jaxws.helloworld;
import javax.jws.WebService;
@WebService
public interface HelloWorld {
String greetings(String text);
}
เราใส่คำอธิบายประกอบอินเทอร์เฟซด้วยไฟล์ @WebServiceแท็ก ต่อไปเราจะใช้อินเทอร์เฟซนี้
การใช้งานเว็บอินเตอร์เฟส
การใช้งานเว็บอินเตอร์เฟสแสดงไว้ที่นี่ -
//HelloWorldImpl.java
package com.tutorialspoint.cxf.jaxws.helloworld;
public class HelloWorldImpl implements HelloWorld {
@Override
public String greetings(String name) {
return ("hi " + name);
}
}
วิธีการทักทายมีคำอธิบายประกอบ @Overrideแท็ก วิธีนี้จะส่งคืนข้อความ "hi" ไปยังผู้โทร
ต่อไปเราจะเขียนโค้ดสำหรับพัฒนาเซิร์ฟเวอร์
กำลังพัฒนาเซิร์ฟเวอร์
ซึ่งแตกต่างจากแอปพลิเคชัน POJO ตอนนี้เราจะแยกส่วนต่อประสานโดยใช้คลาส Endpoint ที่จัดเตรียมไว้ให้ CXF เพื่อเผยแพร่บริการของเรา สิ่งนี้ทำได้ในโค้ดสองบรรทัดต่อไปนี้ -
HelloWorld implementor = new HelloWorldImpl();
Endpoint.publish(
"http://localhost:9090/HelloServerPort",
implementor,
new LoggingFeature()
);
พารามิเตอร์แรกของวิธีการเผยแพร่ระบุ URL ที่จะให้บริการของเราแก่ลูกค้า พารามิเตอร์ที่สองระบุคลาสการใช้งานสำหรับบริการของเรา รหัสทั้งหมดสำหรับเซิร์ฟเวอร์แสดงอยู่ด้านล่าง -
//Server.java
package com.tutorialspoint.cxf.jaxws.helloworld;
import javax.xml.ws.Endpoint;
import org.apache.cxf.ext.logging.LoggingFeature;
public class Server {
public static void main(String[] args) throws Exception {
HelloWorld implementor = new HelloWorldImpl();
Endpoint.publish("http://localhost:9090/HelloServerPort",
implementor,
new LoggingFeature());
System.out.println("Server ready...");
Thread.sleep(5 * 60 * 1000);
System.out.println("Server exiting ...");
System.exit(0);
}
}
ในการปรับใช้เซิร์ฟเวอร์ของเราคุณจะต้องทำการแก้ไขเพิ่มเติมเล็กน้อยในโครงการของคุณตามรายการด้านล่าง
การปรับใช้เซิร์ฟเวอร์
สุดท้ายในการปรับใช้แอปพลิเคชันเซิร์ฟเวอร์คุณจะต้องทำการปรับเปลี่ยนอีกครั้งใน pom.xml เพื่อตั้งค่าแอปพลิเคชันของคุณเป็นเว็บแอปพลิเคชัน รหัสที่คุณต้องเพิ่มลงในไฟล์pom.xml ได้รับด้านล่าง -
<profiles>
<profile>
<id>server</id>
<build>
<defaultGoal>test</defaultGoal>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>java</goal>
</goals>
<configuration>
<mainClass>
com.tutorialspoint.cxf.jaxws.helloworld.Server
</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
ก่อนที่คุณจะปรับใช้แอปพลิเคชันคุณต้องเพิ่มไฟล์อีกสองไฟล์ในโปรเจ็กต์ของคุณ สิ่งเหล่านี้แสดงในภาพหน้าจอด้านล่าง -
ไฟล์เหล่านี้เป็นไฟล์มาตรฐาน CXF ซึ่งกำหนดการแม็ปสำหรับ CXFServlet. รหัสภายในweb.xml ไฟล์จะแสดงที่นี่สำหรับการอ้างอิงอย่างรวดเร็วของคุณ -
//Web.xml
<?xml version = "1.0" encoding = "UTF-8"??>
<web-app xmlns = "http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5"
xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>cxf</display-name>
<servlet>
<description>Apache CXF Endpoint</description>
<display-name>cxf</display-name>
<servlet-name>cxf</servlet-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
<load-on-startup>
1
</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>
cxf
</servlet-name>
<url-pattern>
/services/*
</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>60</session-timeout>
</session-config>
</web-app>
ใน cxf-servlet.xml,คุณประกาศคุณสมบัติสำหรับปลายทางของบริการของคุณ สิ่งนี้แสดงในข้อมูลโค้ดด้านล่าง -
<beans ...>
<jaxws:endpoint xmlns:helloworld = "http://tutorialspoint.com/"
id = "helloHTTP"
address = "http://localhost:9090/HelloServerPort"
serviceName = "helloworld:HelloServiceService"
endpointName = "helloworld:HelloServicePort">
</jaxws:endpoint>
</beans>
ที่นี่เรากำหนดรหัสสำหรับปลายทางบริการของเราที่อยู่ที่จะให้บริการชื่อบริการและชื่อปลายทาง ตอนนี้คุณได้เรียนรู้ว่าบริการของคุณได้รับการกำหนดเส้นทางและประมวลผลโดย servlet CXF อย่างไร
pom.xml สุดท้าย
pom.xmlรวมการอ้างอิงเพิ่มเติมอีกเล็กน้อย แทนที่จะอธิบายการอ้างอิงทั้งหมดเราได้รวมเวอร์ชันสุดท้ายของ 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-jaxws</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<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>
<profiles>
<profile>
<id>server</id>
<build>
<defaultGoal>test</defaultGoal>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>java</goal>
</goals>
<configuration>
<mainClass>
com.tutorialspoint.cxf.jaxws.helloworld.Server
</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.jaxws.helloworld.Client
</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<dependencies>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.3.0</version>
</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-features-logging</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.3.0</version>
</dependency>
</dependencies>
</project>
โปรดทราบว่ายังมีโปรไฟล์สำหรับการสร้างไคลเอนต์ที่เราจะเรียนรู้ในส่วนต่อไปของบทช่วยสอนนี้
เรียกใช้บริการ HelloWorld
ตอนนี้คุณพร้อมที่จะเรียกใช้เว็บแอปแล้ว ในหน้าต่างคำสั่งให้รันสคริปต์บิลด์โดยใช้คำสั่งต่อไปนี้
mvn clean install
mvn -Pserver
คุณจะเห็นข้อความต่อไปนี้บนคอนโซล -
INFO: Setting the server's publish address to be http://localhost:9090/HelloServerPort
Server ready…
เช่นเดียวกับก่อนหน้านี้คุณสามารถทดสอบเซิร์ฟเวอร์ได้โดยเปิด URL ของเซิร์ฟเวอร์ในเบราว์เซอร์ของคุณ
เนื่องจากเราไม่ได้ระบุการดำเนินการใด ๆ แอปพลิเคชันของเราจะส่งข้อความแสดงข้อผิดพลาดไปยังเบราว์เซอร์
ตอนนี้ลองเพิ่มไฟล์ ?wsdl ไปยัง URL ของคุณและคุณจะเห็นผลลัพธ์ต่อไปนี้ -
แอปพลิเคชันเซิร์ฟเวอร์ของเราจึงทำงานตามที่คาดไว้ คุณสามารถใช้ SOAP Client เช่นPostman อธิบายไว้ก่อนหน้านี้เพื่อทดสอบบริการของคุณเพิ่มเติม
ในส่วนถัดไปเราจะเรียนรู้วิธีการเขียนลูกค้าที่ใช้บริการของเรา
การพัฒนาลูกค้า
การเขียนไคลเอนต์ในแอปพลิเคชัน CXF นั้นไม่สำคัญพอ ๆ กับการเขียนเซิร์ฟเวอร์ นี่คือรหัสที่สมบูรณ์สำหรับลูกค้า -
//Client.java
package com.tutorialspoint.cxf.jaxws.helloworld;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.soap.SOAPBinding;
public final class Client {
private static final QName SERVICE_NAME
= new QName("http://helloworld.jaxws.cxf.tutorialspoint.com/",
"HelloWorld");
private static final QName PORT_NAME
= new QName("http://helloworld.jaxws.cxf.tutorialspoint.com/",
"HelloWorldPort");
private Client() {
}
public static void main(String[] args) throws Exception {
Service service = Service.create(SERVICE_NAME);
System.out.println("service created");
String endpointAddress = "http://localhost:9090/HelloServerPort";
service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING,
endpointAddress);
HelloWorld hw = service.getPort(HelloWorld.class);
System.out.println(hw.greetings("World"));
}
}
ที่นี่เราใช้ CXF ที่ให้มา Serviceคลาสเพื่อผูกกับบริการที่รู้จัก เราเรียกว่าcreate วิธีการบน Serviceคลาสเพื่อรับอินสแตนซ์ของบริการ เราตั้งค่าพอร์ตที่รู้จักโดยเรียกไฟล์addPort วิธีการบน service ตัวอย่าง.
ตอนนี้เราพร้อมที่จะใช้บริการซึ่งเราทำได้โดยการรับอินเทอร์เฟซบริการก่อนโดยโทรไปที่ไฟล์ getPort วิธีการบน serviceตัวอย่าง. สุดท้ายเราเรียกgreetings วิธีการพิมพ์ข้อความทักทายบนคอนโซล
ตอนนี้เมื่อคุณได้เรียนรู้พื้นฐานของ CXF โดยใช้แนวทาง Apache CXF-First ตอนนี้คุณจะได้เรียนรู้วิธีใช้ CXF กับแนวทาง WSDL-First ในบทต่อไปของเรา