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包解压后,目录大概就这样

 CXF WebService_第1张图片

bin目录提供的是常用的dos控制台命令工具

docs 帮助文档

lib jar包、依赖库

lib-samples 也是jar包,有jettyhttpclientsjunitjar

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 WSDLWSDL to JavaXSD to WSDLWSDL to XMLWSDL to SOAPWSDL to Service

支持 JAX-WS JAX-WSAJSR-181 SAAJ;支持 SOAP 1.11.2WS-I BasicProfileWS-SecurityWS-AddressingWS-RM WS-Policy;支持 WSDL 1.12.0;支持 MTOM;、JavaScript、通过 Yoko支持 CORBA;通过 Tuscany支持 SCA;通过 ServiceMix支持 JBI

内置Jetty应用服务器

 

CXF 入门实例

又一HelloWorld示例,老套的HelloWorld是入门经典。也是基础和必须掌握的,下面看看HelloWorldWebService,很简单。

需要的jar包如下:

CXF WebService_第2张图片

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 [email protected]
 * @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 [email protected]
 * @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 [email protected]
 * @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 [email protected]
 * @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用法:
wsdl2java -p com -d src -all  aa.wsdl
-p  指定其wsdl的命名空间,也就是要生成代码的包名:
-d  指定要产生代码所在目录
-client 生成客户端测试web service的代码
-server 生成服务器启动web  service的代码
-impl 生成web service的实现代码
-ant  生成build.xml文件
-all 生成所有开始端点代码:types,service proxy,,service interface, server mainline, client mainline, implementation object, and an Ant build.xml file.
详细用法见:http://cwiki.apache.org/CXF20DOC/wsdl-to-java.html

注意:运行时,要一定先要发布web sevice.

 


 



 

 

你可能感兴趣的:(webservice,CXF)