📜  带有POJO的Apache CXF

📅  最后修改于: 2020-10-28 05:32:05             🧑  作者: Mango


在本章中,您将学习如何开发一个简单的Web应用程序,该应用程序向用户发送问候消息。一个Web服务项目使用WSDL模型。 CXF通过提供一个简单的前端来将Apache CXF API映射到基础WSDL,从而允许您隐藏此WSDL模型。

在这个最简单的项目中,Web服务的接口将直接向客户端公开,并且客户端将使用本机Apache CXF API来调用Web服务。

首先,我们将创建一个Web服务。每个服务都有一个公开给客户端的接口。我们可以将此接口编写为简单的Apache CXF接口或WSDL文档。在这种Apache CXF-First方法中,我们将通过Apache CXF接口公开我们的服务。

开发Web服务

我们将在Web上创建的服务将只有一个称为Greetings的Web方法。该方法采用字符串类型参数,我们将在其中发送用户名。该服务将向您发送回问候消息,消息中包含接收到的用户名。

Web服务界面

为了公开我们的Web服务的接口,我们将创建一个Apache CXF接口,如下所示:

//HelloWorld.java
package com.tutorialspoint.cxf.pojo;
public interface HelloWorld {
   String greetings(String text);
}

该界面只有一种方法称为greetings 。服务器将实现此接口。在我们的琐碎应用程序中,此接口直接暴露给客户端。通常,在Web服务应用程序中,您使用WSDL描述Web服务界面。在这个简单的应用程序中,我们将提供此直接接口给客户端开发人员。然后,客户端将在服务器对象上调用问候消息。因此,首先让我们创建Web服务。

Web服务实施

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方法接收字符串类型的参数,将其附加到greeting消息中,然后将结果字符串返回给调用方。

接下来,我们编写服务器应用程序以承载HelloWorld服务。

创建服务器

服务器应用程序由两部分组成-

  • 第一部分为我们的Web服务创建工厂,然后

  • 第二部分编写了一个实例化它的主要方法。

服务器使用CXF库提供的ServerFactoryBean类将HelloWorld接口公开给远程客户端。因此,我们首先实例化ServerFactoryBean类,然后设置其各种属性-

ServerFactoryBean factory = new ServerFactoryBean();

我们通过在工厂对象上调用setServiceClass方法来设置要调用的服务类-

factory.setServiceClass(HelloWorld.class);

我们通过调用工厂的setAddress方法来设置用于调用服务的URL。请注意,该服务将在此URL上发布。

factory.setAddress("http://localhost:5000/Hello");

在这种情况下,该服务将部署在嵌入式服务器上,并且将侦听端口5000。您可以选择任意端口号。

在创建工厂之前,您需要向工厂介绍我们的服务实现类。这是通过在工厂对象上调用setServiceBean方法来完成的,如下所示:

factory.setServiceBean(new HelloWorldImpl());

服务bean设置为我们的服务实现类的实例。最后,我们通过调用工厂的create方法来创建工厂-

factory.create();

现在,当我们已经开发了运行我们的Web服务的工厂时,接下来我们将编写一个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);
   }
}

我们创建的服务器应用程序使用CXF库中的ServerFactoryBean类。现在,我们必须在我们的项目中包括这些库,以成功编译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文件。

生成的目录结构如下所示-

目录结构

您将在pom.xml中添加CXF依赖项,还将上述创建的Apache CXF文件复制到maven创建的结构的相应文件夹中。为了方便您参考,我们在下面为我们在计算机上创建的项目提供了pom.xml文件。



   4.0.0
   com.tutorialspoint
   cxf-pojo
   1.0
   jar
   
   
      
         server
         
            test
            
               
                  org.codehaus.mojo
                  exec-maven-plugin
                  
                     
                        test
                        
                           java
                        
                        
                           
                              com.tutorialspoint.cxf.pojo.HelloServer
                           
                        
                     
                  
               
            
         
      
      
      
         client
         
            test
            
               
                  org.codehaus.mojo
                  exec-maven-plugin
                  
                     
                        test
                        
                           java
                        
                        
                           
                           com.tutorialspoint.cxf.pojo.HelloClient
                           
                        
                     
                  
               
            
         
      
   

   
      
         org.apache.cxf
         cxf-rt-features-logging
         3.3.0
         jar
      
      
         org.apache.cxf
         cxf-rt-frontend-simple
         3.3.0
         jar
      
      
         org.apache.cxf
         cxf-rt-transports-http
         3.3.0
      
      
         org.apache.cxf
         cxf-rt-frontend-jaxws
         3.3.0
      
      
      
         org.apache.cxf
         cxf-rt-transports-http-jetty
         3.3.0
      
   
   
      UTF-8
      1.8
      1.8
   

上面的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。您将看到以下输出-

输出文件树

这确认我们的服务正在本地主机上的指定端口上运行。由于未在调用中指定问候消息,因此SOAP错误消息将返回到浏览器。

您可以使用所选的SOAP客户端进一步测试Web服务。在这里,我们使用Postman来测试我们的服务器。

输出如下所示-

运行服务器输出

观察SOAP请求是手工编码的。发布请求后,服务器发送了SOAP响应消息,该消息显示在屏幕截图的底部。

由此,您可以了解CXF在请求和响应中都使用SOAP协议,同时为您提供当今世界上各种Web技术的统一视图。这大大简化了Web应用程序的开发。

我们的下一个任务是创建一个将使用您创建的Web服务的客户端。

创建客户

在服务器应用程序HelloWorld中,是暴露我们的Web服务的接口。 Web服务本身仅向客户端提供简单的问候消息。通常,Web服务接口使用WSDL(Web服务描述语言)向外界公开。在这个简单的应用程序中,我们将通过直接公开服务接口(即HelloWorld.class)向客户端公开Web服务。

为此,CXF提供了一个名为ClientProxyFactoryBean的工厂类,该类允许我们将所需的接口连接到所创建的工厂实例。

首先,我们创建一个工厂bean实例,如下所示:

ClientProxyFactoryBean factory = new ClientProxyFactoryBean();

我们在工厂bean实例上调用setAddress方法来设置URL,通过该URL可以调用我们的Web服务。在我们的例子中,我们将使用在先前步骤中创建服务器时使用的URL-

factory.setAddress("http://localhost:5000/Hello");

接下来,我们在工厂实例上调用create方法,将我们的服务接口HelloWorld.class附加到该方法。

HelloWorld helloServer = factory.create(HelloWorld.class);

最后,我们调用greetings方法来调用远程Web服务。

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是我们的用户名。您会以自己的名字问候。

在下一章中,我们将学习如何在JAX-WS(用于XML Web Services的Apache CXF API)项目中使用CXF。