使用cxf搭建WebService

配图
搭建WebService的框架有不少,之所有用CXF是因为它是Apache维护的一个开源框架,能搭配Spring一起使用且使用上也很简单。

一、下载CXF

可以从Apache下载到最新版的CXF压缩包,jar包包含在压缩包的lib文件夹里面。下载这个主要是为了方便使用命令行。如果我们使用maven的话,也可以直接配置pom.xml文件来加载Spring和CXF,方便省事。还可以跳过第二部,直接看如何创建。

二、配置CXF到环境变量里

CXF可以使用命令行来根据服务端(客户端)生成客户端(服务端)代码。也可以根据代码(xml)生成xml文件(代码)。所以,配置一下还是很有必要的。配置环境变量需要去Apache官网上下载CXF的压缩包。

下载并解压出来,如我解压的位置是

1
E:\tools\apache-cxf-3.0.10

接着,进入配置变量的界面,新建

1
2
名称为: CXF_Home
变量值为:E:\tools\apache-cxf-3.0.10

如图
config

在path中添加

1
;%CXF_HOME%\bin;

config2

需要注意的是,path中添加才需要加bin,如果新建的变量就添加了bin,会因为有些东西是从lib中加载,而路径配置到了bin而加载不到报下面的错,如图
config3

安装成功的话,输入

1
wsdl2java -v

会出现如下提示
config4

三、用myeclipse搭建一个webservice

在搭建项目的时候,我使用了maven来导入cxf的包,而spring的jar包因为以前的项目有配置好的,我直接拿过来用了,所以没有在maven添加了。

webservice的搭建分为两部分,一是服务端,一是客户端。

1、webservice服务端的搭建

  • 新建一个名为webservice的web project,勾选上Add Maven support。
  • 项目创建好后在pom.xml这个文件里加入cxf的内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-api</artifactId>
    <version>2.5.0</version>
    </dependency>
    <dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxws</artifactId>
    <version>2.5.0</version>
    </dependency>
    <dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-bindings-soap</artifactId>
    <version>2.5.0</version>
    </dependency>
    <dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http</artifactId>
    <version>2.5.0</version>
    </dependency>
    <dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-ws-security</artifactId>
    <version>2.5.0</version>
    </dependency>
  • 加载完毕后就可以编写接口了,接口代码如下

    1
    2
    3
    4
    5
    6
    7
    package com.mycompany.webservice.server;
    import javax.jws.WebService;
    @WebService
    public interface Greeting {
    public String greeting(String userName);
    }
  • 实现接口

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import java.util.Calendar;
    import javax.jws.WebService;
    @WebService(endpointInterface = "com.mycompany.webservice.server.Greeting")
    public class GreetingServiceImpl implements Greeting {
    public String greeting(String userName) {
    return "Hello " + userName + ", currentTime is "
    + Calendar.getInstance().getTime();
    }
    }
  • 在applicationContext.xml进行配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://cxf.apache.org/jaxws
    http://cxf.apache.org/schemas/jaxws.xsd">
    <bean id="greetingServiceImpl" class="com.mycompany.webservice.server.GreetingServiceImpl" />
    <jaxws:endpoint id="greetingService" implementor="#greetingServiceImpl" address="/Greeting" />
    </beans>
  • 在web.xml进行配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <!--cxf 配置 webservice 服务 -->
    <servlet>
    <servlet-name>CXFServlet</servlet-name>
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
    <servlet-name>CXFServlet</servlet-name>
    <!--==这个设置很重要,那么我们的webservice的地址就是http://localhost:8080/yourProgramName/webservice/Greeting===-->
    <url-pattern>/WebService/*</url-pattern>
    </servlet-mapping>

到这边,服务端就完成了。发布可以像普通的web project一样发布。发布完毕,访问http://localhost:8080/webservice/WebService/Greeting?wsdl,如果有显示出xml文件的内容来即发布成功。

2、webService客户端

用cxf创建webService的客户端有两种方式:

  • 通过cxf命令行生成客户端代码。

以之前发布的服务端为例,如果我们要生成它的客户端代码,可通过以下命令

1
wsdl2java -client -encoding utf8 -frontend http://localhost:8080/webservice/WebService/Greeting?wsdl

会自动生成java文件,如下图
config5
其中,Greeting_GreetingServiceImplPort_Client.java是测试类,可直接运行,如有参数,也直接修改参数后使用。

  • 通过cxf提供的方法直接访问

如果是通过这个方法来访问,则需要知道提供的接口方法和需要传递的参数。

1
2
3
4
5
6
7
8
9
10
11
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
public class Test2 {
public static void main(String[] args) throws Exception {
JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance();
Client client = (Client) factory.createClient("http://localhost:8080/webservice/WebService/Greeting?wsdl");
System.out.println("invoke webservice...");
Object[] result = client.invoke("greeting", "gray"}); //第一个参数为方法名,第二个参数为需要传递的参数,如果参数有多个,可使用数组进行传值
System.out.println("message context is:"+result[0]);
}
}

四、测试

当我们服务端运行起来后,运行客户端掉用方法,可看到运行结果
config6
到此,一个简单的webService就搭建好了。

黄自豪 wechat
欢迎我的公众号!
如果你觉得文章对你有帮助,可点击下面的打赏按钮,支持一下!