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標準。
如圖所示
/src/main/java 存放原始碼
/src/main/resources 存放配置資原始檔
/src/main/webapp web專案根目錄
/target/classes 編譯檔案輸出目錄
然後修改編譯輸出目錄為WEB-INF/classes,修改部署設定
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>Dynamic Web Module前面打勾>Further configuration available>將content改為/src/main/webapp。
2.專案各部分版本一定要相容,如tomcat7支援的Dynamic Web Module為2.2-3.0。
3.專案jdk與tomcat執行環境jdk保持一致。