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依赖:

  ......
  
  <dependencies>
      <dependency>
          <groupId>org.apache.cxfgroupId>
          <artifactId>cxf-rt-frontend-jaxwsartifactId>
          <version>3.0.0version>
      dependency>
      <dependency>
          <groupId>org.apache.cxfgroupId>
          <artifactId>cxf-rt-transports-httpartifactId>
          <version>3.0.0version>
      dependency>
      <dependency>
          <groupId>org.apache.cxfgroupId>
          <artifactId>cxf-rt-transports-http-jettyartifactId>
          <version>3.0.0version>
      dependency>
      
  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标准。
CXF实现简单webservice应用、集成spring发布到tomcat_第1张图片

如图所示

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

然后修改编译输出目录为WEB-INF/classes,修改部署设置
CXF实现简单webservice应用、集成spring发布到tomcat_第2张图片
CXF实现简单webservice应用、集成spring发布到tomcat_第3张图片

pom.xml添加cxf、spring依赖

      
      <dependency>
          <groupId>org.apache.cxfgroupId>
          <artifactId>cxf-rt-frontend-jaxwsartifactId>
          <version>3.0.0version>
      dependency>
      <dependency>
          <groupId>org.apache.cxfgroupId>
          <artifactId>cxf-rt-transports-httpartifactId>
          <version>3.0.0version>
      dependency>
      <dependency>
          <groupId>org.apache.cxfgroupId>
          <artifactId>cxf-rt-transports-http-jettyartifactId>
          <version>3.0.0version>
      dependency>
      
      
      <dependency>
        <groupId>org.springframeworkgroupId>
        <artifactId>spring-contextartifactId>
        <version>4.3.8.RELEASEversion>
      dependency>
      <dependency>
        <groupId>org.springframeworkgroupId>
        <artifactId>spring-webartifactId>
        <version>4.3.8.RELEASEversion>
      dependency>
      

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


    ......
    
    <context-param>
        <param-name>contextConfigLocationparam-name>
        <param-value>/WEB-INF/config/cxf-servlet.xmlparam-value>
    context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
    listener>
    
    <servlet>
        <servlet-name>CXFServletservlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServletservlet-class>
        <load-on-startup>1load-on-startup>
    servlet>
    <servlet-mapping>
        <servlet-name>CXFServletservlet-name>
        <url-pattern>/service/*url-pattern>
    servlet-mapping>
    
    <welcome-file-list>
        <welcome-file>index.htmlwelcome-file>
    welcome-file-list>
web-app>

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

<body>

align="center">this is a webservice demo

body>

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


<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,具体为

CXF实现简单webservice应用、集成spring发布到tomcat_第4张图片
CXF实现简单webservice应用、集成spring发布到tomcat_第5张图片

打开项目属性>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保持一致。

你可能感兴趣的:(CXF实现简单webservice应用、集成spring发布到tomcat)