Apache CXF พร้อม WSDL First
แอปพลิเคชัน CXF-POJO ที่คุณพัฒนาส่งผลให้เกิดการมีเพศสัมพันธ์ที่แน่นหนาระหว่างไคลเอนต์และเซิร์ฟเวอร์ การให้เข้าถึงอินเทอร์เฟซบริการโดยตรงอาจก่อให้เกิดภัยคุกคามด้านความปลอดภัยที่รุนแรง ดังนั้นการแยกส่วนระหว่างไคลเอนต์และเซิร์ฟเวอร์จึงเป็นที่ต้องการซึ่งทำได้โดยใช้ WSDL (Web Services Description Language)
เราเขียนอินเทอร์เฟซบริการเว็บในเอกสาร WSDL ซึ่งใช้ XML เราจะใช้เครื่องมือเพื่อแมปอินเทอร์เฟซ WSDL นี้กับ Apache CXF ซึ่งจะนำไปใช้งานและใช้งานโดยไคลเอนต์และแอปพลิเคชันเซิร์ฟเวอร์ของเรา สำหรับการแยกชิ้นส่วนการเริ่มต้นด้วย WSDL เป็นวิธีที่ต้องการ สำหรับสิ่งนี้คุณต้องเรียนรู้ภาษาใหม่ก่อน - WSDL การเขียน WSDL จำเป็นต้องมีแนวทางที่รอบคอบและจะดีกว่าถ้าคุณสามารถทำความเข้าใจเกี่ยวกับเรื่องนี้ได้ก่อนที่จะเริ่มดำเนินการ
ในบทเรียนนี้เราจะเริ่มต้นด้วยการกำหนดส่วนต่อประสานบริการเว็บในเอกสาร WSDL เราจะเรียนรู้วิธีใช้ CXF เพื่อสร้างทั้งเซิร์ฟเวอร์และแอปพลิเคชันไคลเอนต์โดยเริ่มจาก WSDL เราจะทำให้แอปพลิเคชั่นใช้งานง่ายเพื่อรักษาโฟกัสที่การใช้ CXF หลังจากสร้างแอปพลิเคชันเซิร์ฟเวอร์แล้วเราจะเผยแพร่ไปยัง URL ที่ต้องการโดยใช้คลาส CXF ในตัว
ขั้นแรกให้เราอธิบาย WSDL ที่เราจะใช้
WSDL สำหรับ HelloWorld
บริการเว็บที่เราจะนำไปใช้จะมีวิธีการเดียวที่เรียกว่า webmethod greetings ที่ยอมรับไฟล์ stringพารามิเตอร์ถือชื่อผู้ใช้และส่งคืนข้อความสตริงไปยังผู้โทรหลังจากต่อท้ายข้อความทักทายกับชื่อผู้ใช้ wsdl ที่สมบูรณ์แสดงไว้ด้านล่าง -
//Hello.wsdl
<?xml version = "1.0" encoding = "UTF-8"?>
<wsdl:definitions xmlns:soap = "http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns = "http://helloworld.tutorialspoint.com/"
xmlns:wsdl = "http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd = "http://www.w3.org/2001/XMLSchema"
name = "HelloWorld"
targetNamespace = "http://helloworld.tutorialspoint.com/">
<wsdl:types>
<xsd:schema attributeFormDefault = "unqualified"
elementFormDefault = "qualified"
targetNamespace = "http://helloworld.tutorialspoint.com/">
<xsd:element name = "greetings" type = "tns:greetings"/>
<xsd:complexType name = "greetings">
<xsd:sequence>
<xsd:element minOccurs = "0" name = "arg0" type = "xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name = "greetingsResponse"
type = "tns:greetingsResponse"/>
<xsd:complexType name = "greetingsResponse">
<xsd:sequence>
<xsd:element minOccurs = "0" name = "return" type = "xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</wsdl:types>
<wsdl:message name = "greetings">
<wsdl:part element = "tns:greetings" name = "parameters"> </wsdl:part>
</wsdl:message>
<wsdl:message name = "greetingsResponse">
<wsdl:part element = "tns:greetingsResponse" name = "parameters"> </wsdl:part>
</wsdl:message>
<wsdl:portType name = "HelloWorldPortType">
<wsdl:operation name = "greetings">
<wsdl:input message = "tns:greetings" name = "greetings"> </wsdl:input>
<wsdl:output message = "tns:greetingsResponse" name = "greetingsResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name = "HelloWorldSoapBinding" type = "tns:HelloWorldPortType">
<soap:binding style = "document"
transport = "http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name = "greetings">
<soap:operation soapAction = "" style = "document"/>
<wsdl:input name = "greetings"></wsdl:input>
<wsdl:output name = "greetingsResponse">
<soap:body use = "literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name = "HelloWorldService">
<wsdl:port binding = "tns:HelloWorldSoapBinding" name = "HelloWorldPort">
<soap:address location = "http://localhost:9090/HelloServerPort"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
โปรดทราบว่าการเขียน wsdl ที่ถูกต้องตามหลักไวยากรณ์เป็นสิ่งที่ท้าทายสำหรับนักพัฒนาเสมอมา มีเครื่องมือมากมายและตัวแก้ไขออนไลน์สำหรับสร้าง wsdl บรรณาธิการเหล่านี้ขอชื่อของข้อความที่คุณต้องการใช้พร้อมกับพารามิเตอร์ที่คุณต้องการส่งผ่านในข้อความและประเภทของข้อความส่งคืนที่คุณต้องการให้แอปพลิเคชันไคลเอ็นต์ของคุณได้รับ หากคุณรู้จักไวยากรณ์ wsdl คุณสามารถเขียนโค้ดให้กับเอกสารทั้งหมดหรือใช้ตัวแก้ไขเพื่อสร้างขึ้นเอง
ใน wsdl ข้างต้นเราได้กำหนดข้อความเดียวที่เรียกว่า greetings. ข้อความจะถูกส่งไปยังบริการที่เรียกว่าHelloWorldService ที่กำลังทำงานอยู่ที่ http://localhost:9090/HelloServerPort.
ด้วยเหตุนี้เราจะดำเนินการพัฒนาเซิร์ฟเวอร์ต่อไป ก่อนที่จะพัฒนาเซิร์ฟเวอร์เราจำเป็นต้องสร้างอินเทอร์เฟซ Apache CXF ในบริการเว็บของเรา สิ่งนี้จะต้องทำจาก wsdl ที่กำหนด ในการดำเนินการนี้ให้คุณใช้เครื่องมือที่เรียกว่าwsdl2java.
ปลั๊กอิน wsdl2java
เนื่องจากเราจะใช้ maven ในการสร้างโครงการคุณจะต้องเพิ่มปลั๊กอินต่อไปนี้ในไฟล์ pom.xml ไฟล์.
<plugins>
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<wsdlOptions>
<wsdlOption>
<wsdl>src/main/resources/hello.wsdl</wsdl>
<faultSerialVersionUID> 1 </faultSerialVersionUID>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
โปรดทราบว่าเราระบุตำแหน่งของไฟล์ wsdl ไฟล์เป็น src/main/resources/Hello.wsdl. คุณจะต้องแน่ใจว่าคุณได้สร้างโครงสร้างไดเร็กทอรีที่เหมาะสมสำหรับโปรเจ็กต์ของคุณและเพิ่มสิ่งที่แสดงก่อนหน้านี้hello.wsdl ไฟล์ไปยังโฟลเดอร์ที่ระบุ
wsdl2javaปลั๊กอินจะรวบรวม wsdl นี้และสร้างคลาส Apache CXF ในโฟลเดอร์ที่กำหนดไว้ล่วงหน้า โครงสร้างโครงการทั้งหมดแสดงไว้ที่นี่สำหรับการอ้างอิงพร้อมของคุณ
ตอนนี้คุณพร้อมที่จะสร้างเซิร์ฟเวอร์โดยใช้ไฟล์ wsdl2javaสร้างคลาส คลาสที่ wsdl2java สร้างขึ้นจะแสดงในรูปด้านล่าง -
อินเทอร์เฟซบริการที่สร้างขึ้น
ในรายการคลาสที่สร้างขึ้นคุณต้องสังเกตว่าหนึ่งในนั้นคืออินเทอร์เฟซ Apache CXF - นี่คือ HelloWorldPortType.java. ตรวจสอบไฟล์นี้ในโปรแกรมแก้ไขโค้ดของคุณ เนื้อหาของไฟล์จะแสดงไว้ที่นี่สำหรับการอ้างอิงของคุณ -
//HelloWorldPortType.java
package com.tutorialspoint.helloworld;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;
/**
* This class was generated by Apache CXF 3.3.0
* 2019-02-11T12:05:55.220+05:30
* Generated source version: 3.3.0
*
*/
@WebService(targetNamespace = "http://helloworld.tutorialspoint.com/",
name = "HelloWorldPortType")
@XmlSeeAlso({ObjectFactory.class})
public interface HelloWorldPortType {
@WebMethod
@RequestWrapper(localName = "greetings", targetNamespace =
"http://helloworld.tutorialspoint.com/", className =
"com.tutorialspoint.helloworld.Greetings")
@ResponseWrapper(localName = "greetingsResponse", targetNamespace =
"http://helloworld.tutorialspoint.com/", className =
"com.tutorialspoint.helloworld.GreetingsResponse")
@WebResult(name = "return", targetNamespace =
"http://helloworld.tutorialspoint.com/")
public java.lang.String greetings(
@WebParam(name = "arg0", targetNamespace =
"http://helloworld.tutorialspoint.com/")
java.lang.String arg0
);
}
โปรดทราบว่าอินเทอร์เฟซมีวิธีการที่เรียกว่า greetings. นี่คือประเภทข้อความใน wsdl ของเรา wsdl2javaเครื่องมือได้เพิ่มวิธีนี้ในอินเทอร์เฟซที่สร้างขึ้น ตอนนี้คุณสามารถเข้าใจแล้วว่าข้อความใดก็ตามที่คุณเขียนใน wsdl วิธีการที่เกี่ยวข้องจะถูกสร้างขึ้นในอินเทอร์เฟซ
ตอนนี้งานของคุณคือใช้วิธีการเหล่านี้ทั้งหมดที่สอดคล้องกับข้อความต่างๆที่คุณได้กำหนดไว้ใน wsdl ของคุณ โปรดทราบว่าในตัวอย่างก่อนหน้านี้ของ Apache CXF-First เราเริ่มต้นด้วยอินเทอร์เฟซ Apache CXF สำหรับบริการเว็บของเรา ในกรณีนี้อินเทอร์เฟซ Apache CXF ถูกสร้างขึ้นจาก wsdl
การใช้อินเทอร์เฟซบริการ
การใช้อินเทอร์เฟซบริการเป็นเรื่องเล็กน้อย การใช้งานเต็มรูปแบบแสดงอยู่ในรายการด้านล่าง -
//HelloWorldImpl.java
package com.tutorialspoint.helloworld;
public class HelloWorldImpl implements HelloWorldPortType {
@Override
public String greetings(String name) {
return ("hi " + name);
}
}
รหัสใช้วิธีการเชื่อมต่อเดียวที่เรียกว่า greetings. เมธอดใช้พารามิเตอร์หนึ่งตัวstring พิมพ์ข้อความ "hi" ล่วงหน้าและส่งกลับสตริงผลลัพธ์ไปยังผู้โทร
ต่อไปเราจะเขียนโปรแกรมเซิร์ฟเวอร์
กำลังพัฒนาเซิร์ฟเวอร์
การพัฒนาแอปพลิเคชันเซิร์ฟเวอร์เป็นเรื่องเล็กน้อยอีกครั้ง ที่นี่เราจะใช้ CXF ที่ให้มาEndpointชั้นเรียนเพื่อเผยแพร่บริการของเรา สิ่งนี้ทำได้ในโค้ดสองบรรทัดต่อไปนี้ -
HelloWorldPortType implementor = new HelloWorldImpl();
Endpoint.publish("http://localhost:9090/HelloServerPort",
implementor,
new LoggingFeature());
ขั้นแรกเราสร้างวัตถุของคลาสผู้ใช้บริการของเรา - HelloWorldImpl. จากนั้นเราส่งข้อมูลอ้างอิงนี้เป็นพารามิเตอร์ที่สองไปยังไฟล์publishวิธี. พารามิเตอร์แรกคือที่อยู่ที่เผยแพร่บริการ - ลูกค้าจะใช้ URL นี้เพื่อเข้าถึงบริการ แหล่งที่มาทั้งหมดสำหรับแอ็พพลิเคชันเซิร์ฟเวอร์มีให้ที่นี่ -
//Server.java
package com.tutorialspoint.helloworld;
import javax.xml.ws.Endpoint;
import org.apache.cxf.ext.logging.LoggingFeature;
public class Server {
public static void main(String[] args) throws Exception {
HelloWorldPortType 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. ดังแสดงด้านล่าง -
<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.helloworld.Server
</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.3.0</version>
</dependency>
</dependencies>
</profile>
โปรดทราบว่าชื่อแบบเต็มของไฟล์ Serverคลาสถูกระบุในการกำหนดค่า นอกจากนี้แท็กการอ้างอิงยังระบุว่าเราจะใช้เว็บเซิร์ฟเวอร์ของท่าเทียบเรือในตัวเพื่อปรับใช้แอปพลิเคชันเซิร์ฟเวอร์ของเรา
การปรับใช้เซิร์ฟเวอร์
สุดท้ายในการปรับใช้แอปพลิเคชันเซิร์ฟเวอร์คุณจะต้องทำการปรับเปลี่ยนอีกครั้งใน pom.xml เพื่อตั้งค่าแอปพลิเคชันของคุณเป็นเว็บแอปพลิเคชัน รหัสที่คุณต้องเพิ่มลงในไฟล์pom.xml ได้รับด้านล่าง -
<defaultGoal>install</defaultGoal>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<webXml>src/main/webapp/WEB-INF/web.xml</webXml>
<webResources>
<resource>
<directory>src/main/resources</directory>
<targetPath>WEB-INF</targetPath>
<includes>
<include>*.wsdl</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>
</plugins>
</pluginManagement>
ก่อนที่คุณจะปรับใช้แอปพลิเคชันคุณต้องเพิ่มไฟล์อีกสองไฟล์ในโปรเจ็กต์ของคุณ สิ่งเหล่านี้แสดงในภาพหน้าจอด้านล่าง -
ไฟล์เหล่านี้เป็นไฟล์มาตรฐาน CXF ซึ่งกำหนดการแม็ปสำหรับ CXFServlet. รหัสภายในweb.xml ไฟล์จะแสดงที่นี่สำหรับการอ้างอิงอย่างรวดเร็วของคุณ -
//cxf-servlet.xml
<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-wsdl</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>
<build>
<defaultGoal>install</defaultGoal>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<webXml>src/main/webapp/WEB-INF/web.xml</webXml>
<webResources>
<resource>
<directory>src/main/resources</directory>
<targetPath>WEB-INF</targetPath>
<includes>
<include>*.wsdl</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<wsdlOptions>
<wsdlOption>
<wsdl>src/main/resources/Hello.wsdl</wsdl>
<faultSerialVersionUID>1</faultSerialVersionUID>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<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.helloworld.Server
</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.3.0</version>
</dependency>
</dependencies>
</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.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-management</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-features-metrics</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.cxf.xjc-utils</groupId>
<artifactId>cxf-xjc-runtime</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.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.8.0-beta2</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
สิ่งนี้จะสร้างคลาส Apache CXF ที่เหมาะสมจาก wsdl ของคุณรวบรวมคลาส Apache CXF ของคุณปรับใช้เซิร์ฟเวอร์บนเซิร์ฟเวอร์ท่าเทียบเรือแบบฝังและเรียกใช้แอปพลิเคชันของคุณ
คุณจะเห็นข้อความต่อไปนี้บนคอนโซล -
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.helloworld;
public class Client {
public static void main(String[] args) throws Exception {
//Create the service client with its default wsdlurl
HelloWorldService helloServiceService = new HelloWorldService();
System.out.println("service: " +
helloServiceService.getServiceName());
System.out.println("wsdl location: " +
helloServiceService.getWSDLDocumentLocation());
HelloWorldPortType helloService =
helloServiceService.getHelloWorldPort();
System.out.println(helloService.greetings
(System.getProperty("user.name")));
}
}
ที่นี่เราสร้างอินสแตนซ์ของบริการของเรา HelloWorldServiceรับพอร์ตโดยการโทร getHelloWorldPort วิธีการแล้วส่งไฟล์ greetingsส่งข้อความถึงมัน เรียกใช้ไคลเอนต์และคุณจะเห็นผลลัพธ์ต่อไปนี้ -
service: {http://helloworld.tutorialspoint.com/}HelloWorldService
wsdl location: file:/Users/drsarang/Desktop/tutorialpoint/cxf-
wsdl/src/main/resources/Hello.wsdl
hi drsarang
จนถึงตอนนี้คุณได้เรียนรู้วิธีใช้ CXF กับสถาปัตยกรรม Apache CXF-First และ WSDL-First ในแนวทาง Apache CXF-First คุณใช้ POJO กับServerFactoryBeanคลาสจากไลบรารี CXF เพื่อสร้างเซิร์ฟเวอร์ เพื่อสร้างไคลเอนต์ที่คุณใช้ClientProxyFactoryBeanคลาสจากไลบรารี CXF ในแนวทาง WSDL-First คุณใช้Endpointคลาสเพื่อเผยแพร่บริการที่ URL ที่ต้องการและผู้ใช้งานที่ระบุ ตอนนี้คุณสามารถขยายเทคนิคเหล่านี้เพื่อรวมโปรโตคอลและการขนส่งที่แตกต่างกัน