Apache CXF提供了用於方便地構建和開發WebService的可靠基礎架構。它允許創建高性能和可擴展的服務,可以部署在Tomcat和基於Spring的輕量級容器中,也可以部署在更高級的服務器上,例如Jboss、WebSphere或WebLogic。
CXF提供了以下功能:
WebService服務標準支持:
- Java API for XML Web Services (JAX-WS)
- SOAP
- WebService描述語言(Web Services Description Language ,WSDL)
- 消息傳輸優化機制(Message Transmission Optimization Mechanism,MTOM)
- WS-Basic Profile
- WS-Addressing
- WS-Policy
- WS-ReliableMessaging
- WS-Security
前端建模:CXF允許使用不同的前端API來創建Service。如CXF允許使用簡單的工廠Bean並通過JAX-WS實現來創建WebService,允許創建動態WebService客戶端。
- 工具支持:CXF提供了在Java Bean、WebService和WSDL之間進行轉換的工具,提供了對Maven和Ant集成的支持,並無縫地支持Spring集成。
- RESTful支持:CXF支持Restful,並支持Java平臺的JAX-RS實現。
- 對不同傳輸和綁定的支持:CXF支持不同數據類型的傳輸,除了支持SOAP和HTTP協議綁定外,還支持JAXB和AEGIS綁定。
- 對非XML綁定的支持:CXF支持非XML綁定,如JSON、CORBA、JBI和SCA等。
- Code First和Xml First:CXF支持使用Code First或者Xml First的方式創建WebService。
下面用CXF創建獨立發佈的WebService。
服務端
在Eclipse中創建maven項目,配置文件pom.xml中引入CXF,具體配置如下
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.rvho</groupId>
<artifactId>cxfstandalone</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<!-- 文件拷貝編碼 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 輸出編碼 -->
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- 編譯編碼 -->
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<!-- CXF版本 -->
<cxf.version>3.1.1</cxf.version>
</properties>
<dependencies>
<!-- CXF -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<!-- 如果CXF不集成到Web服務器中,必須添加該引用 -->
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>${cxf.version}</version>
</dependency>
<!-- End CXF -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<!-- 指定source和target的jdk版本是1.8 -->
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
服務接口HelloWS,該接口發佈welcome方法。
package com.rvho.cxfstandalone.ws;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
@WebService(
name = "HelloWS",
targetNamespace = "http://www.tmp.com/services/hello"
)
public interface HelloWS {
@WebMethod
String welcome(@WebParam(name = "name") String name);
}
服務接口HelloWS實現類HelloWSImpl。
package com.rvho.cxfstandalone.ws.impl;
import javax.jws.WebService;
import com.rvho.cxfstandalone.ws.HelloWS;
@WebService(
endpointInterface = "com.rvho.cxfserver.ws.HelloWS",
portName = "HelloWSPort",
serviceName = "HelloWSService",
targetNamespace = "http://www.tmp.com/services/hello"
)
public class HelloWSImpl implements HelloWS {
@Override
public String welcome(String name) {
return "Welcome " + name;
}
}
發佈服務
package com.rvho.cxfstandalone;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import com.rvho.cxfstandalone.ws.HelloWS;
import com.rvho.cxfstandalone.ws.impl.HelloWSImpl;
public class CxfServer {
public static void main(String[] args) {
JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
factory.setServiceClass(HelloWS.class);
//服務發佈的地址
factory.setAddress("http://localhost:8999/services/hello");
factory.setServiceBean(new HelloWSImpl());
factory.create();
}
}
在瀏覽器中輸入服務發佈地址http://localhost:8999/services/hello?wsdl如果看到如下內容,表示服務發佈成功。
客戶端
用wsimport或者wsdl2java把服務端發佈的服務生成java對象。
wsimport是jdk提供的wsdl轉java對象工具,在jdk的bin目錄下可以找到。用法是
"D:\Program Files\Java\jdk1.8.0_25\bin\wsimport.exe" -encoding utf-8 -d D:\dev\wsdl\cxfserver\wsimport\compile -s D:\dev\wsdl\cxfserver\wsimport\src -p com.rvho.cxfclient.wsdl.wsimport.hello http://localhost:8999/services/hello?wsdl
wsdl2java是cxf提供的wsdl轉java對象工具,在cxf的bin目錄下可以找到。用法是
"D:\dev\library\java\cxf\apache-cxf-3.1.0\bin\wsdl2java" -p com.rvho.cxfclient.wsdl.cxf.hello -d D:\dev\wsdl\cxfserver\cxf\src http://localhost:8999/services/hello?wsdl
上面命令的路徑是我本機路徑,有可能不一樣。
客戶端可以通過jaxws調用,也可以通過cxf調用。
//jaxws調用
//URL不是必須的,除非服務的地址有改變
URL wsdlUrl = new URL("http://localhost:8999/services/hello?wsdl");
HelloWSService helloWSS = new HelloWSService(wsdlUrl);
HelloWS helloWS = helloWSS.getHelloWSPort();
String welcome = helloWS.welcome("[email protected]");
System.out.println(welcome);
/*
cxf調用
首先在客戶端添加cxf
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.1.1</version>
</dependency>
*/
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(HelloWS.class);
factory.setAddress("http://localhost:8999/services/hello");
HelloWS helloWS = factory.create(HelloWS.class);
String welcome = helloWS.welcome("[email protected]");
System.out.println(welcome);