一、概述
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內置jetty發布WebService
maven:
<properties> <cxf.version>3.1.4</cxf.version> </properties> <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> <!-- 使用cxf內置的jetty服務器發布WebService --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http-jetty</artifactId> <version>${cxf.version}</version> </dependency>
---
接口:
@WebService public interface HelloService{ public String helloCxf(); public String hello(String name);public User getUser(int id); public void saveUser(User user); }
實現:
@WebService(serviceName = "helloService", endpointInterface = "cn.lg.ws.hellocxf.HelloService" ) public class HelloServiceImpl implements HelloService{ @Override public String helloCxf(){ return "Hello CXF!"; } @Override public String hello(String name) { return "Hello " + name; } @Override public User getUser(int id) { User u1 = new User(); return u1; } @Override public void saveUser(User user) { System.out.println(user.toString()); } }
發布:
public class PublishService{ /** * 使用CXF的JaxWsServerFactoryBean發布服務 * @param */ public static void main(String[] args) { JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean(); factory.setServiceClass(HelloService.class); //服務發布地址 factory.setAddress("http://localhost:8088/soap/hello"); factory.setServiceBean(new HelloServiceImpl()); factory.create(); System.out.println("publish success"); } }
使用瀏覽器訪問 http://localhost:8088/soap/hello?wsdl 可以看到wsdl如下,則說明發布成功
使用CXF在客戶端調用WebService:
public class ClientTest{ public static void main(String[] args) { JaxWsProxyFactoryBean jwpfb = new JaxWsProxyFactoryBean(); jwpfb.setServiceClass(HelloService.class); jwpfb.setAddress("http://localhost:8088/sop/hello"); HelloService hs = (HelloService) jwpfb.create(); System.out.println(hs.getUser(101)); Q.p(hs.hello("luangeng")); } }
---
相關類可通過以下命令產生:
wsimport -p com.ickes.cxf.client -keep http://localhost:8088/sop/hello?wsdl