前言:好記性不如爛筆頭,寫博客的好處是,以前接觸的東西即便忘記了,也可以從這里查找。
Apache CXF 是一個開源的 Services 框架,CXF 幫助您利用 Frontend 編程 API 來構建和開發 Services 。可以與Spring進行快速無縫的整合。靈活的部署,可以運行在Tomcat,Jboss,Jetty(內置),IBMWS,BeaWL上面。
更多CXF介紹:http://www.ibm.com/developerworks/cn/education/java/j-cxf/
一、cxf發布服務的類
用兩個不同的類發布應用:
a. ServerFactoryBean -- FacotryBean
b. JaxWsServerFactoryBean(建議使用此類)
服務端與客戶端類的使用映射關系如下圖所示:
二、使用ServerFactoryBean類發布標准的webservice服務
下載cxf安裝包apache-cxf-2.4.2,里面lib下jar包以供項目所有。
1.服務端
a.新建web項目,加入cxf的jar包
b.定義webservice的接口
package com.wp.service; import javax.jws.WebService; @WebService public interface HelloWs { public String sayHello(String name); }
c.定義webservice接口的實現類
package com.wp.service; public class HelloWsImpl implements HelloWs { @Override public String sayHello(String name) { return "hello" + name; } }
d.發布webservice服務
package com.wp.service; import org.apache.cxf.frontend.ServerFactoryBean; public class Server { public static void main(String[] args) { ServerFactoryBean sfb = new ServerFactoryBean(); //1.服務提供者實現的接口 sfb.setServiceClass(HelloWs.class); //2.指定訪問路徑 sfb.setAddress("http://localhost:9090/ws"); //3.指定服務實現類 sfb.setServiceBean(new HelloWsImpl()); //4.發布 sfb.create(); System.out.println("發布成功..."); } }
2.客戶端
a.使用wsdl2java生成客戶端代碼調用服務(之前有解釋,這里就不做解釋了)
b.使用ClientProxyFactoryBean類調用service服務
客戶端必須加入cxf的jar包
瀏覽器訪問http://localhost:9090/ws?wsdl ,查看service和operation
1) 不同項目中調用
package com.wp.test; import com.wp.client.HelloWs; import com.wp.client.HelloWsPortType; public class Client { public static void main(String[] args) { HelloWs hw = new HelloWs(); HelloWsPortType h = hw.getHelloWsPort(); String result = h.sayHello("小強"); System.out.println(result); } }
1) 在同一項目中調用
package com.wp.service; import org.apache.cxf.frontend.ClientProxyFactoryBean; public class Client { public static void main(String[] args) { ClientProxyFactoryBean cfb = new ClientProxyFactoryBean(); cfb.setAddress("http://localhost:9090/ws"); cfb.setServiceClass(HelloWs.class); HelloWs hw = (HelloWs) cfb.create(); System.out.println(hw.sayHello("明明")); } }
類似的例子在apache-cxf-2.4.2安裝包下的samples中,開發的時候可以查看
三、使用JaxWsServerFactoryBean類發布服務
1.服務端
package com.wp.service; import javax.jws.WebParam; import javax.jws.WebService; @WebService public interface HelloWs { public String sayHello(@WebParam(name="text") String text); }
package com.wp.service; import javax.jws.WebService; @WebService(endpointInterface = "com.wp.service.HelloWs") public class HelloWsImpl implements HelloWs { @Override public String sayHello(String name) { return "hello " + name; } }
package com.wp.service; import org.apache.cxf.interceptor.LoggingInInterceptor; import org.apache.cxf.interceptor.LoggingOutInterceptor; import org.apache.cxf.jaxws.JaxWsServerFactoryBean; public class Server { public static void main(String[] args) { JaxWsServerFactoryBean jsfb = new JaxWsServerFactoryBean(); //1.服務提供者實現的接口 jsfb.setServiceClass(HelloWs.class); //2.指定訪問路徑 jsfb.setAddress("http://localhost:9090/ws"); //3.指定服務實現類 jsfb.setServiceBean(new HelloWsImpl()); //jsfb.getInInterceptors().add(new LoggingInInterceptor()); //jsfb.getOutInterceptors().add(new LoggingOutInterceptor()); //4.發布 jsfb.create(); System.out.println("發布成功..."); } }
2.客戶端
生成客戶端代碼:
a.在不同項目中
package com.wp.test; import org.apache.cxf.frontend.ClientProxyFactoryBean; import org.apache.cxf.interceptor.LoggingInInterceptor; import org.apache.cxf.interceptor.LoggingOutInterceptor; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; import com.wp.client.HelloWs; public class Client { public static void main(String[] args) { JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); // factory.getInInterceptors().add(new LoggingInInterceptor()); // factory.getOutInterceptors().add(new LoggingOutInterceptor()); factory.setAddress("http://localhost:9090/ws"); HelloWs client = factory.create(HelloWs.class); System.out.println(client.sayHello("World")); } }
b.在同一項目中
package com.wp.service; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; public class Client { public static void main(String[] args) { JaxWsProxyFactoryBean bean = new JaxWsProxyFactoryBean(); bean.setAddress("http://localhost:9090/ws"); bean.setServiceClass(HelloWs.class); HelloWs hw = (HelloWs) bean.create(); System.out.println(hw.sayHello("www")); } }
四、spring和cxf的集成(MyEclipse)jaxws:server配置
CXF原生支持spring,可以和Spring無縫集成。本例通過tomcat啟動容器來啟動cxf服務。
1.新建一個maven項目(寫過一個隨筆),並且加入jar包

<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.wp.test</groupId> <artifactId>cxfmaven</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>cxfmaven Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <spring.version>3.2.5.RELEASE_BUNDLE</spring.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-asm</artifactId> <version>3.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>2.4.2</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>2.4.2</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>2.4.2</version> </dependency> <!-- Jetty is needed if you're using the CXFServlet --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http-jetty</artifactId> <version>2.4.2</version> </dependency> </dependencies> <build> <finalName>cxfmaven</finalName> </build> </project>
2.讓spring管理ServerFactoryBean

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd "> <!-- 1 導入cxf發布的命名空間 xmlns:jaxws="http://cxf.apache.org/jaxws" http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd 2 通過配置發布webservice服務 2.1 發布簡單的webservice服務(不需要定義服務器的接口 ,了解) <jaxws:endpoint address="" implementor=""> </jaxws:endpoint> 2.2 發布標准的webservice服務 2.2.1 發布的地址 address 2.2.2 發布的服務器實現的接口 serviceClass 2.2.3 指定服務具體提供者(實現類對象) jaxws:serviceBean --> <!-- 實例化一個JaxWsServerFactoryBean對象 --> <jaxws:server address="/helloWs" serviceClass="com.wp.service.HelloWs"> <jaxws:serviceBean> <bean class="com.wp.service.HelloWsImpl"></bean> </jaxws:serviceBean> </jaxws:server> </beans>
3.cxf集成到web容器中

<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>cxf</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <!-- 初始化CXFServlet --> <init-param> <param-name>config-location</param-name> <param-value>classpath:beans.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>cxf</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>
4.啟動web容器發布webservice服務
wsdl訪問地址:http://localhost:8080/wsService/helloWs?wsdl
- 通過Eclipse中的Web Services Explorer進行測試;
- 建立一個客戶端項目進行測試,跟上面一樣。