CXF实现简单webservice应用、集成spring发布到tomcat

前言

Apache CXF提供了用于方便地构建和开发WebService的可靠基础架构。它允许创建高性能和可扩展的服务,可以部署在Tomcat和基于spring的轻量级容器中,也可以部署在更高级的服务器上,例如Jboss、WebSphere或WebLogic。下面将创建一个简单的webservice例子,并集成spring将其发布到tomcat上。
参考:http://cxf.apache.org/docs/a-simple-jax-ws-service.html
http://cxf.apache.org/docs/writing-a-service-with-spring.html
http://blog.csdn.net/accountwcx/article/details/47082487

开发环境

操作系统:win10
Java版本:JDK1.8
IDE工具:eclipse-neon.3
项目管理:Maven3.5
服务器:tomcat7
Maven依赖:

  ......
  <!-- CXF jar包依赖 -->
  <dependencies>
      <dependency>
          <groupId>org.apache.cxf</groupId>
          <artifactId>cxf-rt-frontend-jaxws</artifactId>
          <version>3.0.0</version>
      </dependency>
      <dependency>
          <groupId>org.apache.cxf</groupId>
          <artifactId>cxf-rt-transports-http</artifactId>
          <version>3.0.0</version>
      </dependency>
      <dependency>
          <groupId>org.apache.cxf</groupId>
          <artifactId>cxf-rt-transports-http-jetty</artifactId>
          <version>3.0.0</version>
      </dependency>
      <!-- CXF END -->
  </dependencies>
  ......

一、简单的webservice小例子

构建一个简单的webservice示例只需四步:
1.编写服务接口

import javax.jws.WebParam;
import javax.jws.WebService;

@WebService
public interface HelloWorld {

    //使用@WebParam可以使得自动生成客户端代码时,变量名称不变,
    //若不使用则自动生成的客户端代码中变量名为arg0
    String sayHi(@WebParam(name="text")String text);
    }

2.编写接口实现类

import javax.jws.WebService;
import cn.hl.ws.server.HelloWorld;

@WebService(endpointInterface="cn.hl.ws.server.HelloWorld",
            serviceName="HelloWorld")
public class HelloWorldImpl implements HelloWorld {

    @Override
    public String sayHi(String text) {  
        return "Hello "+text;
    }

}

3.发布服务,这里有两种方法

import javax.xml.ws.Endpoint;
import cn.hl.ws.server.impl.HelloWorldImpl;

public class HelloWorldApp {
    //发布方法一:
    public static void main(String[] args) {

        System.out.println("starting server...");
        HelloWorldImpl hw = new HelloWorldImpl();
        //服务发布的地址
        String address = "http://localhost:8080/helloWorld";
        Endpoint.publish(address, hw);
        System.out.println("server started");
    }

}
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import cn.hl.ws.server.impl.HelloWorldImpl;

public class HelloWorldApp2 {
    //发布方法二:
    public static void main(String[] args) {

        System.out.println("starting server...");
        JaxWsServerFactoryBean fb = new JaxWsServerFactoryBean();
        HelloWorldImpl hw = new HelloWorldImpl();
        fb.setServiceClass(HelloWorld.class);
        //服务发布地址
        fb.setAddress("http://localhost:8080/helloWorld");
        fb.setServiceBean(hw);
        fb.create();
        System.out.println("server started");
    }

}

编写完成后run as java application,若未报错且访问 http://localhost:8080/helloWorld?wsl 能看见xml文档则说明服务发布成功。
4.编写客户端访问服务
首先通过工具自动生成客户端java代码,jdk提供了wsimport,cxf提供了wsdl2java,用法如下:

wsimport -encoding 编码 -s 源码存放目录 -d class文件存放目录 -p 包名 服务地址
wsdl2java -d class文件存放目录 -p 包名 服务地址
//我的是这么写的
wsimport -encoding utf-8 -s E:\wsdl -p cn.ws.client http://localhost:8080/helloWorld?wsdl

将生成的客户端代码拷贝到客户端项目,注意客户端也应添加开始所写的maven依赖

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import cn.hl.ws.server.HelloWorld;

public class HelloClient {

    public static void main(String[] args) {

        JaxWsProxyFactoryBean fb = new JaxWsProxyFactoryBean();
        fb.setServiceClass(HelloWorld.class);
        fb.setAddress("http://localhost:8080/helloWorld");
        HelloWorld hw = (HelloWorld) fb.create();
        String response = hw.sayHi("World!");
        System.out.println(response);
    }

}

,保持服务发布程序运行,然后运行客户端访问服务,可见控制台输出Hello World!,服务调用成功。

集成spring并发布到tomcat

1.用maven新建一个web项目,目录结构应符合maven标准。
maven目录结构

如图所示

/src/main/java  存放源码
/src/main/resources  存放配置资源文件
/src/main/webapp  web项目根目录
/target/classes 编译文件输出目录

然后修改编译输出目录为WEB-INF/classes,修改部署设置
output folder
项目部署设置

pom.xml添加cxf、spring依赖

      <!-- CXF jar包依赖 -->
      <dependency>
          <groupId>org.apache.cxf</groupId>
          <artifactId>cxf-rt-frontend-jaxws</artifactId>
          <version>3.0.0</version>
      </dependency>
      <dependency>
          <groupId>org.apache.cxf</groupId>
          <artifactId>cxf-rt-transports-http</artifactId>
          <version>3.0.0</version>
      </dependency>
      <dependency>
          <groupId>org.apache.cxf</groupId>
          <artifactId>cxf-rt-transports-http-jetty</artifactId>
          <version>3.0.0</version>
      </dependency>
      <!-- CXF END -->
      <!-- spring jar -->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.3.8.RELEASE</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>4.3.8.RELEASE</version>
      </dependency>
      <!-- spring END -->

2.编写web项目其他配置
web.xml


    ......
    <!-- 加载spring配置文件 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/config/cxf-servlet.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- 注册CXF servlet -->
    <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>
        <url-pattern>/service/*</url-pattern>
    </servlet-mapping>
    <!-- CXF END -->
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>

index.html随便写句话测试就行

<body>
<h1 align="center">this is a webservice demo</h1>
</body>

3.然后是服务的编写,与上面例子相同:
(1)编写服务接口类、接口实现类(同上)
(2)spring配置文件cxf-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jaxws="http://cxf.apache.org/jaxws" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://cxf.apache.org/jaxws 
    http://cxf.apache.org/schemas/jaxws.xsd">

    <import resource="classpath:META-INF/cxf/cxf.xml"/>
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
    <bean id="helloWorld" class="cn.hl.ws.server.impl.HelloWorldImpl"/>
    <jaxws:endpoint id="hello" 
    implementor="#helloWorld"
    address="/helloworld"/>

</beans>

此时web项目已构建完毕,服务也可以发布了,run on server 选择tomcat7,成功启动tomcat后访问首页:
http://localhost:8080/webservicedemo1/
能看到我们编写的index.html则项目正常运行,然后访问wsdl地址:
http://localhost:8080/webservicedemo1/service/helloworld?wsdl
能看到xml文档则说明服务发布成功,然后便可以编写客户端访问服务了,此处不再重复赘述。

注:可能出现的问题
1.右键项目没有run on server 选项,请确认你的项目已转化为Dynamic Web Module,具体为

Project Facets

打开项目属性>Project Facets>Dynamic Web Module前面打勾>Further configuration available>将content改为/src/main/webapp。
2.项目各部分版本一定要兼容,如tomcat7支持的Dynamic Web Module为2.2-3.0。
3.项目jdk与tomcat运行环境jdk保持一致。

猜你喜欢

转载自blog.csdn.net/swift0824/article/details/73921000