📅  最后修改于: 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上创建的服务将只有一个称为Greetings的Web方法。该方法采用字符串类型参数,我们将在其中发送用户名。该服务将向您发送回问候消息,消息中包含接收到的用户名。
为了公开我们的Web服务的接口,我们将创建一个Apache CXF接口,如下所示:
//HelloWorld.java
package com.tutorialspoint.cxf.pojo;
public interface HelloWorld {
String greetings(String text);
}
该界面只有一种方法称为greetings 。服务器将实现此接口。在我们的琐碎应用程序中,此接口直接暴露给客户端。通常,在Web服务应用程序中,您使用WSDL描述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项目,请在命令行窗口中键入以下命令。请注意,我们已经在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。