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)