WebService开发
ApacheCXF 框架介绍
关于 Apache CXF
Apache CXF = Celtix + XFire,ApacheCXF 的前身叫 Apache CeltiXfire,现在已经正式
更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和XFire 两大开源项目的精
华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、DataBinding、
Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先
(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使
用。目前它仍只是 Apache 的一个孵化项目。
Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和
开发 Services ,像 JAX-WS 。这些 Services 可以支持多种协议,比如:SOAP、
XML/HTTP、RESTfulHTTP 或者 CORBA ,并且可以在多种传输协议上运行,比如:
HTTP、JMS 或者 JBI,CXF 大大简化了 Services 的创建,同时它继承了 XFire 传统,一
样可以天然地和 Spring 进行无缝集成。
功能特性
CXF 包含了大量的功能特性,但是主要集中在以下几个方面:
(1) 支持 Web Services 标准:CXF 支持多种 Web Services 标准,包含 SOAP、Basic
Profile、WS-Addressing、WS-Policy、WS-ReliableMessaging 和 WS-Security。
(2) Frontends:CXF 支持多种“Frontend”编程模型,CXF 实现了 JAX-WS API (遵循
JAX-WS 2.0 TCK 版本),它也包含一个“simple frontend”允许客户端和 EndPoint 的创
建,而不需要 Annotation 注解。CXF 既支持 WSDL 优先开发,也支持从 Java 的代码优
先开发模式。
(3) 容易使用: CXF 设计得更加直观与容易使用。有大量简单的 API 用来快速地构建代
码优先的 Services,各种 Maven 的插件也使集成更加容易,支持 JAX-WS API ,支持
Spring 2.0 更加简化的 XML 配置方式,等等。
(4) 支持二进制和遗留协议:CXF 的设计是一种可插拨的架构,既可以支持 XML ,也可
以支持非 XML 的类型绑定,比如:JSON 和 CORBA。
WebService(Jax-ws)
服务端
添加cxf依赖
项目的pom.xml 添加如下依赖
<dependencies> <!-- 要进行jaxws 服务开发 --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.0.1</version> </dependency> <!-- 内置jetty web服务器 --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http-jetty</artifactId> <version>3.0.1</version> </dependency> <!-- 日志实现 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.12</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> </dependencies> <build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> <showWarnings>true</showWarnings> </configuration> </plugin> </plugins> </pluginManagement> </build>
.3 写服务接口
/** * 对外发布服务的接口 */ @WebService public interface HelloService { /** * 对外发布服务的接口的方法 */ public String sayHello(String name); }
4. 写服务接口实现
import com.topcheer.webservice.HelloService; public class HelloServiceImpl implements HelloService { @Override public String sayHello(String name) { return name + ",Welcome to WebServicr!"; } }
发布服务
public class Server { public static void main(String[] args) { // 发布服务的工厂 JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean(); // 设置服务地址 factory.setAddress("http://localhost:8000/ws/hello"); // 设置服务类 factory.setServiceBean(new HelloServiceImpl()); // 添加日志输入、输出拦截器,观察soap请求、soap响应内容 factory.getInInterceptors().add(new LoggingInInterceptor()); factory.getOutInterceptors().add(new LoggingOutInterceptor()); // 发布服务 factory.create(); System.out.println("发布服务成功,端口8000....."); } }
访问wsdl说明书
服务发布成功:
然后用soapui一起进行测试:
客户端
写客户端之前要先明确:
1. 服务端地址
2. 服务端接口、接口方法(方法参数、返回值)
它的xml和服务端的一样,这里就不贴出来了
/** * 对外发布服务的接口 */ @WebService public interface HelloService { /** * 对外发布服务的接口的方法 */ public String sayHello(String name); }
public class Client { public static void main(String[] args) { // 服务接口访问地址:http://localhost:8000/ws/hello // 创建cxf代理工厂 JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); // 设置远程访问服务端地址 factory.setAddress("http://localhost:8000/ws/hello"); // 设置接口类型 factory.setServiceClass(HelloService.class); // 对接口生成代理对象 HelloService helloService = factory.create(HelloService.class); // 代理对象对象 class com.sun.proxy.$Proxy34 [Java代理: 1. 静态代理; 2.动态代理(jdk接口代理、cglib子类代理)] $CGLIB123 System.out.println(helloService.getClass()); // 远程访问服务端方法 String content = helloService.sayHello("Jet"); System.out.println(content); } }