Apache CXF với JAX-WS

Trong ứng dụng JAX-WS này, chúng ta sẽ sử dụng cách tiếp cận Apache CXF-first giống như ứng dụng POJO trước đó. Vì vậy, đầu tiên chúng ta sẽ tạo một giao diện cho dịch vụ web của mình.

Khai báo giao diện dịch vụ

Như trong trường hợp trước, chúng ta sẽ tạo một dịch vụ tầm thường chỉ có một phương thức giao diện được gọi là lời chào. Mã cho giao diện dịch vụ được hiển thị bên dưới -

//HelloWorld.java
package com.tutorialspoint.cxf.jaxws.helloworld;
import javax.jws.WebService;

@WebService
public interface HelloWorld {
   String greetings(String text);
}

Chúng tôi chú thích giao diện bằng @WebServicenhãn. Tiếp theo, chúng tôi sẽ thực hiện giao diện này.

Triển khai giao diện web

Việc triển khai giao diện web được hiển thị ở đây -

//HelloWorldImpl.java
package com.tutorialspoint.cxf.jaxws.helloworld;
public class HelloWorldImpl implements HelloWorld {
   @Override
   public String greetings(String name) {
      return ("hi " + name);
   }
}

Phương thức chào hỏi được chú thích bằng @Overridenhãn. Phương thức này trả về một thông báo "hi" cho người gọi.

Tiếp theo, chúng tôi sẽ viết mã để phát triển máy chủ.

Máy chủ đang phát triển

Không giống như ứng dụng POJO, bây giờ chúng tôi sẽ tách giao diện bằng cách sử dụng lớp Endpoint do CXF cung cấp để xuất bản dịch vụ của chúng tôi. Điều này được thực hiện trong hai dòng mã sau:

HelloWorld implementor = new HelloWorldImpl();
Endpoint.publish(
   "http://localhost:9090/HelloServerPort",
   implementor,
   new LoggingFeature()
);

Tham số đầu tiên của phương thức xuất bản chỉ định URL mà tại đó dịch vụ của chúng tôi sẽ được cung cấp cho khách hàng. Tham số thứ hai chỉ định lớp triển khai cho dịch vụ của chúng tôi. Toàn bộ mã cho máy chủ được hiển thị bên dưới -

//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);
   }
}

Để triển khai máy chủ của chúng tôi, bạn sẽ cần thực hiện thêm một số sửa đổi đối với dự án của mình như được liệt kê bên dưới.

Triển khai máy chủ

Cuối cùng, để triển khai ứng dụng máy chủ, bạn sẽ cần thực hiện thêm một sửa đổi nữa trong pom.xml để thiết lập ứng dụng của mình dưới dạng ứng dụng web. Mã mà bạn cần thêm vàopom.xml được đưa ra dưới đây -

<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>

Trước khi triển khai ứng dụng, bạn cần thêm hai tệp nữa vào dự án của mình. Chúng được hiển thị trong ảnh chụp màn hình bên dưới -

Các tệp này là tệp tiêu chuẩn CXF xác định ánh xạ cho CXFServlet. Mã trongweb.xml tệp được hiển thị ở đây để bạn tham khảo nhanh -

//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>

bên trong cxf-servlet.xml,bạn khai báo các thuộc tính cho điểm cuối dịch vụ của bạn. Điều này được hiển thị trong đoạn mã bên dưới -

<beans ...>
   <jaxws:endpoint xmlns:helloworld = "http://tutorialspoint.com/"
      id = "helloHTTP"
      address = "http://localhost:9090/HelloServerPort"
      serviceName = "helloworld:HelloServiceService"
      endpointName = "helloworld:HelloServicePort">
   </jaxws:endpoint>
</beans>

Ở đây chúng tôi xác định id cho điểm cuối dịch vụ của chúng tôi, địa chỉ mà dịch vụ sẽ khả dụng, tên dịch vụ và tên điểm cuối. Bây giờ, bạn đã biết cách dịch vụ của mình được định tuyến và xử lý bởi một Servlet CXF.

Pom.xml cuối cùng

Các pom.xmlbao gồm một số phụ thuộc khác. Thay vì mô tả tất cả các phụ thuộc, chúng tôi đã đưa vào phiên bản cuối cùng của pom.xml bên dưới:

<?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>

Lưu ý rằng nó cũng bao gồm một hồ sơ để xây dựng ứng dụng khách mà chúng ta sẽ tìm hiểu trong các phần sau của hướng dẫn này.

Chạy dịch vụ HelloWorld

Bây giờ, bạn đã sẵn sàng để chạy ứng dụng web. Trong cửa sổ lệnh, chạy tập lệnh xây dựng bằng lệnh sau.

mvn clean install
mvn -Pserver

Bạn sẽ thấy thông báo sau trên bảng điều khiển -

INFO: Setting the server's publish address to be http://localhost:9090/HelloServerPort
Server ready…

Giống như trước đó, bạn có thể kiểm tra máy chủ bằng cách mở URL máy chủ trong trình duyệt của mình.

Vì chúng tôi không chỉ định bất kỳ thao tác nào, nên chỉ có một thông báo lỗi được ứng dụng của chúng tôi trả về trình duyệt.

Bây giờ, hãy thử thêm ?wsdl vào URL của bạn và bạn sẽ thấy kết quả sau:

Vì vậy, ứng dụng máy chủ của chúng tôi đang chạy như mong đợi. Bạn có thể sử dụng Ứng dụng khách SOAP chẳng hạn nhưPostman được mô tả trước đó để kiểm tra thêm dịch vụ của bạn.

Trong phần tiếp theo, chúng ta sẽ học cách viết một khách hàng sử dụng dịch vụ của chúng ta.

Đang phát triển khách hàng

Việc viết ứng dụng khách trong ứng dụng CXF cũng đơn giản như viết một máy chủ. Đây là mã hoàn chỉnh cho máy khách -

//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"));
   }
}

Ở đây, chúng tôi sử dụng CXF được cung cấp Servicelớp để liên kết với dịch vụ đã biết. Chúng tôi gọi làcreate phương pháp trên Servicelớp để lấy một thể hiện của dịch vụ. Chúng tôi đặt cổng đã biết bằng cách gọiaddPort phương pháp trên service ví dụ.

Bây giờ, chúng tôi đã sẵn sàng sử dụng dịch vụ, mà chúng tôi thực hiện bằng cách lấy giao diện dịch vụ trước tiên bằng cách gọi getPort phương pháp trên serviceví dụ. Cuối cùng, chúng tôi gọigreetings để in thông báo lời chào trên bảng điều khiển.

Bây giờ, khi bạn đã học những kiến ​​thức cơ bản về CXF bằng cách sử dụng phương pháp Apache CXF-First, bây giờ bạn sẽ học cách sử dụng CXF với phương pháp WSDL-First trong chương tiếp theo của chúng ta.