1. 程式人生 > >CXF實現簡單webservice應用、整合spring釋出到tomcat

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保持一致。