当前位置: 代码迷 >> Web前端 >> Java那些事情之(二)Webservice之CXF
  详细解决方案

Java那些事情之(二)Webservice之CXF

热度:243   发布时间:2012-11-22 00:16:41.0
Java那些事儿之(二)Webservice之CXF

这是按照网上一个示例说明,自己又从新做了一下。

当然这也是工作需要。简单易懂。

?

版本是apache-cxf-2.6.2

?

百度的名片:

关于Apache CXF

  Apache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire,现在已经正式更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。Apache CXF已经是一个正式的Apache顶级项目。

  Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程API 来构建和开发 Services ,像 JAX-WS 。这些 Services 可以支持多种协议,比如:SOAP、XML/HTTP、RESTful HTTP 或者 CORBA ,并且可以在多种传输协议上运行,比如:HTTP、JMS 或者 JBI,CXF 大大简化了 Services 的创建,同时它继承了 XFire 传统,一样可以天然地和 Spring 进行无缝集成。

?

?一、如何发布一个Webservice

先看一下要发布的那个Java文件:

package com.eetrust.webservice;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
import javax.jws.WebParam;
/**  
 * function:CXF WebService 服务器端helloWorld示例  
 * @author sunac
 * @createDate 2012-9-26 上午08:29:07  
 * @file HelloWorldService.java  
 * @package com.eetrust.webservice  
 * @project TestProperty  
 * @version 1.0  
 */
@WebService
@SOAPBinding(style = Style.RPC)
public class HelloWorldService {
	
	public String sayHello(@WebParam(name = "name") String name){
		return name + "say: HelloWorld";
		//可以其他处理逻辑
	}

}

?

下面要对这个Service进行发布了:

看下面这个代码文件:

package com.eetrust.deploy;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;

import com.eetrust.webservice.HelloWorldService;
/**  
 * function:CXF WebService 服务器端发布  
 * @author sunnyboysac
 * @createDate 2012-9-26 上午08:29:07  
 * @file HelloWorldService.java  
 * @package com.eetrust.deploy  
 * @project TestProperty  
 * @version 1.0  
 */
public class DeployHelloWorldService {
	public static void deploy(){
		System.out.println("-----Server start -----");
		HelloWorldService service = new HelloWorldService();
		JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean();
		factoryBean.setAddress("http://localhost:8080/HelloWorld");
		factoryBean.setServiceClass(HelloWorldService.class);
		factoryBean.setServiceBean(service);
		factoryBean.create();
		System.out.println("发布成功");
	}
	
	public static void main(String[] args) {
		deploy();
	}
}

?

运行上面这个文件,Console显示发布成功的话,该Webservice就可以使用了访问http://localhost:8080/HelloWorld?wsdl

可以访问的话,说明Webservice发布成功了

?

二、如何生成Java客户端调用Webservice

?通过wsdl2java命令工具来生成客户端
? 进入dos界面 ,进入apache-cxf-2.6.2/bin下执行命令 ?wsdl2java -p com.eetrust.client -d d:/ ?http://127.0.0.1:8080/HelloWorld?wsdl
? dir 命令用于查看文件列表
? 解释:
? ? ? 命令的格式为:wsdl2java -p 包名 -d 生成代码存放目录?wsdl的url
? ? ??wsdl的url为要调用的webservice的服务地址
? ? ? wsdl2java用法:
? ? ? ? ? ? ? ? ?wsdl2java -p com -d src -all ?aa.wsdl
? ? ? ? ? ? ? ? ? ? ?-p 指定其wsdl的命名空间,也就是要生成代码的包名;
? ? ? ? ? ? ? ? ? ? ?-d 指定要产生代码所在目录;
? ? ? ? ? ? ? ? ? ??-client 生成客户端测试web service的代码;
? ? ? ? ? ? ? ? ? ??-server 生成服务器启动web service的代码;
? ? ? ? ? ? ? ? ? ??-impl 生成web service的实现代码;
? ? ? ? ? ? ? ? ? ??-impl 生成web service的实现代码;
? ? ? ? ? ? ? ? ? ??-all 生成所有开始端点代码:types,service proxy, service interface, server mainline, client mainline, implementation object, and an Ant build.xml file。?
执行命令之后会生成代码,将其拷入自己工程里,写个文件
package com.eetrust.client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
/**
 * function cxf客户端 调用webservice提供的方法sayHello
 * @author sunac
 * @createDate 2012-09-27
 * @file Client.java
 * @package com.eetrust.client
 * @project TestProperty 
 * @version 1.0
 */
public class Client {
	public static void main(String[] args) throws Exception{
		JaxWsDynamicClientFactory cxf = JaxWsDynamicClientFactory.newInstance();
		org.apache.cxf.endpoint.Client client = cxf.createClient("http://127.0.0.1:8080/HelloWorld?wsdl");
		System.out.println("===================================");
		//sayHello 为接口中定义的方法名称   张三为传递的参数  返回
		Object[] objects = client.invoke("sayHello", "张三");
		//输出调用结果
		System.out.println(objects[0].toString());
	}
}

?

运行main之后 ?控制台信息:
2012-9-27 20:51:38 org.apache.cxf.common.jaxb.JAXBUtils logGeneratedClassNames
信息: Created classes:?
javacTask: 无源文件
用法: javacTask <options> <source files>
-help 用于列出可能的选项
2012-9-27 20:51:38 org.apache.cxf.endpoint.dynamic.DynamicClientFactory createClient
严重: Could not compile java files for http://127.0.0.1:8080/HelloWorld?wsdl.
===================================
张三say: HelloWorld

调用成功。
  相关解决方案