一、CXF WebService准备
CXF官网:http://cxf.apache.org/
从官网上下载CXF Jar,将下载下来的Jar包解压后,目录为:
1、bin目录提供的是常用的dos控制台命令工具
2、docs 帮助文档
3、lib jar包、依赖库
4、lib-samples 也是jar包,有jetty、httpclients、junit等jar包
5、modules 打包好的WebService模块
6、samples示例demo
需要的Jar包如下:
1、 HelloWorldService服务器端代码
package com.iflytek.service;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
/**
* @author xdwang
*
* @create Apr 25, 2013 10:23:54 PM
*
* @email:xdwangiflytek@gmail.com
*
* @description CXF WebService 服务器端helloWorld示例
*
*/
@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
2、发布HelloWorldService
package com.iflytek.service.deploy;
import javax.xml.ws.Endpoint;
import com.iflytek.service.HelloWorldService;
/**
* @author xdwang
*
* @create Apr 25, 2013 10:28:13 PM
*
* @email:xdwangiflytek@gmail.com
*
* @description 发布CXF WebService
*
*/
public class DeployHelloWorldService {
/**
* @descrption 发布WebService
* @author xdwang
* @create Apr 25, 201310:28:45 PM
*/
public static void deployService() {
System.out.println("Server start ……");
HelloWorldService service = new HelloWorldService();
String address = "http://localhost:8000/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函数后在WebBrowser中请求:http://localhost:8000/helloWorld?wsdl,如果可以看到xml内容,说明发布成功了。
其中有会报
Exception in thread "main" org.apache.cxf.bus.extension.ExtensionException: Could not load extension class org.apache.cxf.ws.policy.AssertionBuilderRegistryImpl. at org.apache.cxf.bus.extension.Extension.tryClass(Extension.java:173) at org.apache.cxf.bus.extension.Extension.getClassObject(Extension.java:185) at org.apache.cxf.bus.extension.ExtensionManagerImpl.activateAllByType(ExtensionManagerImpl.java:138) at org.apache.cxf.bus.extension.ExtensionManagerBus.<init>(ExtensionManagerBus.java:126) at org.apache.cxf.bus.extension.ExtensionManagerBus.<init>(ExtensionManagerBus.java:134) at org.apache.cxf.bus.CXFBusFactory.createBus(CXFBusFactory.java:40) at org.apache.cxf.bus.CXFBusFactory.createBus(CXFBusFactory.java:36) at org.apache.cxf.bus.CXFBusFactory.createBus(CXFBusFactory.java:32) at org.apache.cxf.BusFactory.getDefaultBus(BusFactory.java:106) at org.apache.cxf.BusFactory.createThreadBus(BusFactory.java:216) at org.apache.cxf.BusFactory.getThreadDefaultBus(BusFactory.java:206) at org.apache.cxf.BusFactory.getThreadDefaultBus(BusFactory.java:193) at org.apache.cxf.jaxws.spi.ProviderImpl.createEndpoint(ProviderImpl.java:128) at org.apache.cxf.jaxws.spi.ProviderImpl.createAndPublishEndpoint(ProviderImpl.java:151) at javax.xml.ws.Endpoint.publish(Unknown Source) at com.iflytek.service.deploy.DeployHelloWorldService.deployService(DeployHelloWorldService.java:28) at com.iflytek.service.deploy.DeployHelloWorldService.main(DeployHelloWorldService.java:33) Caused by: java.lang.NoClassDefFoundError: org/apache/neethi/AssertionBuilderFactory at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(Unknown Source) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$000(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(Unknown Source) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$000(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at org.apache.cxf.bus.extension.Extension.tryClass(Extension.java:169) ... 16 more Caused by: java.lang.ClassNotFoundException: org.apache.neethi.AssertionBuilderFactory at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 41 more
找了半天也没搞定,无奈之下将CXF的lib下的所有jar都copy进去了,就没报了,想找出具体是缺失哪一个也没找到,唉。
3、定制客户端调用WebService的接口
这个接口中的方法签名和参数信息可以从wsdl中的内容看到,代码如下:
package com.iflytek.service;
import javax.jws.WebParam;
import javax.jws.WebService;
/**
* @author xdwang
*
* @create Apr 25, 2013 10:30:38 PM
*
* @email:xdwangiflytek@gmail.com
*
* @description 客户端调用WebService所需要的接口
*
*/
@WebService
public interface IHelloWorldService {
public String sayHello(@WebParam(name = "name") String name);
}
4、编写客户端调用WebService代码
package com.iflytek.client;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import com.iflytek.service.IHelloWorldService;
/**
* @author xdwang
*
* @create Apr 25, 2013 10:35:50 PM
*
* @email:xdwangiflytek@gmail.com
*
* @description CXF WebService客户端调用代码
*
*/
public class HelloWorldServiceClient {
public static void main(String[] args) { // 调用WebService
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(IHelloWorldService.class);
factory.setAddress("http://localhost:8000/helloWorld");
IHelloWorldService service = (IHelloWorldService) factory.create();
System.out.println("[result]" + service.sayHello("xdwang"));
}
}
运行结果:
2013-7-25 18:53:40 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass 信息: Creating Service {http://service.iflytek.com/}IHelloWorldServiceService from class com.iflytek.service.IHelloWorldService [result]xdwang say: Hello World