CXF WebService
简介Apache CXF是一个Service框架,他简化了Service的创建, CXF实现了JAX-WS2.0规范,并通过了JAX-WS2.0 TCK; CXF和Spring无缝集成;CXF支持多种传输协议(HTTP, JMS, Corba等), 支持多种Binding数据格式(SOAP,XML,JSON等), 支持多种DataBinding数据类型(JAXB, Aegis) 。CXF基于Interceptor的架构,使得整个框架非常易于扩展。 准备工作? 1、? CXF官方网址:http://cxf.apache.org/ 2、? Jar包下载地址:http://www.apache.org/dyn/closer.cgi?path=/cxf/2.3.3/apache-cxf-2.3.3.zip 将下来的jar包解压后,目录大概就这样 ? bin目录提供的是常用的dos控制台命令工具 docs 帮助文档 lib jar包、依赖库 lib-samples 也是jar包,有jetty、httpclients、junit等jar包 modules 打包好的WebService模块 samples示例demo 3、? 源码下载:http://www.apache.org/dyn/closer.cgi?path=/cxf/2.3.3/apache-cxf-2.3.3-src.zip 有时候你可以看看源码,对你了解和学习CXF WebService都会有作用。 4、? CXF的特性 有代码生成工具:Java to WSDL;WSDL to Java;XSD to WSDL;WSDL to XML;WSDL to SOAP;WSDL to Service; 支持 JAX-WS、 JAX-WSA、JSR-181和 SAAJ;支持 SOAP 1.1、1.2、WS-I BasicProfile、WS-Security、WS-Addressing、WS-RM和 WS-Policy;支持 WSDL 1.1、2.0;支持 MTOM;、JavaScript、通过 Yoko支持 CORBA;通过 Tuscany支持 SCA;通过 ServiceMix支持 JBI 内置Jetty应用服务器 ? CXF 入门实例又一HelloWorld示例,老套的HelloWorld是入门经典。也是基础和必须掌握的,下面看看HelloWorldWebService,很简单。 需要的jar包如下: HelloWorldService服务器端代码? package com.hoo.service; import javax.jws.WebParam; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import javax.jws.soap.SOAPBinding.Style; /** * <b>function:</b>CXF WebService 服务器端helloWorld示例 * @author hoojo * @createDate 2011-3-16 上午08:29:07 * @file HelloWorld.java * @package com.hoo.service * @project CXFWebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ @WebService @SOAPBinding(style = Style.RPC) public class HelloWorldService { public String sayHello(@WebParam(name = "name") String name) { return name + " say: Hello World "; } }
要说明的是,上面的服务器端代码运用了JDK5的新特性Annotation,这个非常好用。 需要注意的是,如果不添加@SOAPBinding(style = Style.RPC)注解,将会出现异常: ? com.sun.xml.internal.ws.model.RuntimeModelerException: runtime modeler error 还有就是如果jdk版本在1.6下,也会出现上面的异常。 解决办法有: 1> 先用apt命令将主程序进行编译,然后生成一些java文件 2> 升级JDK到版本jdk1.6u17或以后 发布HelloWorldService代码如下: package com.hoo.service.deploy; import javax.xml.ws.Endpoint; import com.hoo.service.HelloWorldService; /** * <b>function:</b> 发布CXF WebService * @author hoojo * @createDate 2011-3-17 上午09:24:33 * @file DeployHelloWorldService.java * @package com.hoo.deploy * @project CXFWebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class DeployHelloWorldService { /** * <b>function:</b>发布WebService * @author hoojo */ public static void deployService() { System.out.println("Server start ……"); HelloWorldService service = new HelloWorldService(); String address = "http://localhost:9000/helloWorld"; Endpoint.publish(address,service); } public static void main(String[] args) throws InterruptedException { //发布WebService deployService(); System.out.println("server ready ……"); Thread.sleep(1000 * 60); System.out.println("server exiting"); //休眠60秒后就退出 System.exit(0); ? 运行上面的main函数后,如果没有发现异常。基本信息是这样的: Server start …… 2011-3-17 10:17:25 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass 信息: Creating Service {http://service.hoo.com/}HelloWorldServiceService from class com.hoo.service.HelloWorldService 2011-3-17 10:17:25 org.apache.cxf.endpoint.ServerImpl initDestination 信息: Setting the server's publish address to be http://localhost:9000/helloWorld 2011-03-17 10:17:25.375:INFO::jetty-7.2.2.v20101205 2011-03-17 10:17:25.468:INFO::Started SelectChannelConnector@localhost:9000 server ready …… 那么你在WebBrowser中请求: http://localhost:9000/helloWorld?wsdl就可以看到xml内容了。 定制客户端调用WebService的接口package com.hoo.service; import javax.jws.WebParam; import javax.jws.WebService; /** * <b>function:</b> 客户端调用WebService所需要的接口 * @author hoojo * @createDate 2011-3-17 上午09:00:00 * @file IHelloWorldService.java * @package com.hoo.service * @project CXFWebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ @WebService public interface IHelloWorldService { public String sayHello(@WebParam(name = "name") String name); } ? 编写客户端调用WebService代码package com.hoo.client; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; import com.hoo.service.IHelloWorldService; /** * <b>function:</b>CXF WebService客户端调用代码 * @author hoojo * @createDate 2011-3-16 上午09:03:49 * @file HelloWorldServiceClient.java * @package com.hoo.client * @project CXFWebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class HelloWorldServiceClient { public static void main(String[] args) { //调用WebService JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); factory.setServiceClass(IHelloWorldService.class); factory.setAddress("http://localhost:9000/helloWorld"); IHelloWorldService service = (IHelloWorldService) factory.create(); System.out.println("[result]" + service.sayHello("hoojo")); } } 运行上面的程序后,结果如下: 2011-3-17 10:23:34 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass 信息: Creating Service {http://service.hoo.com/}IHelloWorldServiceService from class com.hoo.service.IHelloWorldService [result]hoojo say: Hello World
cxf生成webservice客户端方法1:写个测试类: ? import org.apache.cxf.tools.wsdlto.WSDLToJava; public class Test { public static void main(String[] args) { System.out.println("debug"); WSDLToJava.main(new String[] { "-impl","-client","-d","src","-p","com.cdg.cdp.manage.ws.policyno.impl","http://192.168.76.167:8080/manage/ws/queryPolicyNo?wsdl"}); System.out.println("Done!"); } }
方法2:配置环境变量%CXF_HOME%=E:/WebService/CXF/apache-cxf-2.1.1/apache-cxf-2.1.1(以我的目录为例),并在PATH后加上;%CXF_HOME%/bin 在cmd命令行中输入wsdl2java如果显示其用法表示配置好了。 输入:wsdl2java -d src - client??http://localhost:9000/helloWorld?wsdl ?wsdl2java用法: 注意:运行时,要一定先要发布web sevice. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |