1、记得调整你的jdk版本为jdk1.6.0_24.
2、将所有cxf的jar包拷贝到项目中来。添加到classpth中。
3、在开发之前可以先阅读CXF_HOME\lib\WATCH_JARS文件,分析jar文件之间的依赖关系。鉴于简单开发,所以直接都拷贝过来。
(在我的项目当中已经去除了一些jar文件。)
CXF发布服务的类:
服务与客户端类调用原则:
使用ServerFactoryBean发布服务:
@WebService
/**
* 通过@BindingType(value=SOAPBinding.SOAP12HTTP_BINDING)转换为实现SOAP1.2
*/
public interface IHelloService {
public String sayHello(String name);
}
public class HelloServiceImpl implements IHelloService {
public String sayHello(String name) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("sayHello()... name:" + name);
return sdf.format(new Date()) + " hello " + name;
}
}
/**
*
* 使用JaxWsServerFactoryBean发布CXF的Web服务
* 必须加入WebService注解,如果不加,虽然不报错,但是所有的方法都暴露不出来
*/
public class Server {
public static void main(String[] args) {
JaxWsServerFactoryBean bean = new JaxWsServerFactoryBean();
bean.setAddress("http://127.0.0.1:7788/hello");
//提供服务的类的类型或接口类型
bean.setServiceClass(IHelloService.class);
bean.setServiceBean(new HelloServiceImpl());
//加入请求的消息拦截器
bean.getInInterceptors().add(new LoggingInInterceptor());
//加入请求的消息拦截器
bean.getOutInterceptors().add(new LoggingOutInterceptor());
bean.create();
System.out.println("Hello Service ready...");
}
}
使用ClientProxyFactoryBean客户端调用:
public class Client {
public static void main(String[] args) {
ClientProxyFactoryBean bean = //创建客户端类
new ClientProxyFactoryBean();
//设置访问地址
bean.setAddress("http://localhost:9999/one");
//设置服务接口,直接使用本项目中的接口
bean.setServiceClass(CxfOne.class);
//通过create方法返回接口实例
CxfOne s = (CxfOne) bean.create();
String str = s.sayHi();//调用
System.err.println(str);
}
}
使用JaxWsServerFactoryBean发布服务: (建议使用此类)
使用CXF的类发布一个服务:
/**
* 使用JaxWsServerFactoryBean发布CXF的Web服务
* 必须加入WebService注解,如果不加,虽然不报错,但是所有的方法都<b>暴露不出来<b>
*/
@WebService
public class HiService {
public String sayHi(String name){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("sayHi()... name:" + name);
return sdf.format(new Date()) + " hi " + name;
}
public static void main(String[] args) {
JaxWsServerFactoryBean bean = new JaxWsServerFactoryBean();
//服务的地址
bean.setAddress("http://127.0.0.1:6789/hi");
//提供服务的类的类型
bean.setServiceClass(HiService.class);
//提供服务的实例
bean.setServiceBean(new HiService());
//发布服务 publish()...
bean.create();
System.out.println("server ready...");
}
}
使用JaxWsProxyFactoryBean客户端调用
public class A {
public static void main(String[] args) {
//Cxf2Server t =
//new Cxf2ServerService().getCxf2ServerPort();
//String s = t.sayHello();
//System.err.println(s);
JaxWsProxyFactoryBean bean =
new JaxWsProxyFactoryBean();
bean.setAddress("http://localhost:9999/two");
//此外注册的必须是一个接口,否则将抛出异常信息
bean.setServiceClass(Cxf2Server.class);
Cxf2Server s = (Cxf2Server) bean.create();
System.err.println(s.sayHello());
}
}
wsdl2java生成客户代码:
wsdl2java –d .http://127.0.0.1:6666/helloworld?wsdl
1、注意:由于使用的是apache-cxf-2.4.0版本,它是支持jdk1.7的。所以,对于生成的Service要进行稍微的修改。
在jdk1.6中的javax.xml.ws.Service的构造方法接收二个参数为:(Stringurl,QNameqname);
在jdk1.7中的javax.xml.ws.Service的构造方法中接收三个参数为:(Stringurl,QNameqname,features);
2、将生成的代码,拷贝到项目目录,然后使用以前相同方法调用。
注意:如果你对@WebMethod设置了header=true参数,将会在调用时多传递一个参数。它参数可以直接传null值。
对于这种情况,可以将header=true修改成header=false然后再重要获取客户端源代码。
3、大家可能发现了,使用cxf生成的客户端代码与wsimport差不多,甚至是一样,那为什么还要使用cxf呢?
它较好的发布方式、较容易的与其他服务器集成、及与Spring的完美结合都不得不让我们使用cxf。
调用端代码:
1、必须已经使用wsimport或wsdl2java生成了客户端代码。
以下是源代码:
/**
* 使用java6来调用cxf生成的客户端类的服务
* 不管是用wsimport还是用wsdl2java生成的类基本上是完全一样的
*/
public class App {
public static void main(String[] args) {
IHelloServiceService hss = new IHelloServiceService();
IHelloService hs = hss.getIHelloServicePort();
String ret = hs.sayHello("aa");
System.out.println(ret);
}
}
给服务添加消息拦截器:-这个非常有用:
public class Server {
public static void main(String[] args) {
JaxWsServerFactoryBean bean = new JaxWsServerFactoryBean();
bean.setAddress("http://127.0.0.1:7788/hello");
//提供服务的类的类型或接口类型
bean.setServiceClass(IHelloService.class);
bean.setServiceBean(new HelloServiceImpl());
//加入请求的消息拦截器
bean.getInInterceptors().add(new LoggingInInterceptor());
//加入请求的消息拦截器
bean.getOutInterceptors().add(new LoggingOutInterceptor());
bean.create();
System.out.println("Hello Service ready...");
}
}
总结:
@WebService
@BindingType(value=SOAPBinding.SOAP12HTTP_BINDING)
/**
* 通过@BindingType(value=SOAPBinding.SOAP12HTTP_BINDING)转换为实现SOAP1.2
*/
public interface IHelloService {
public String sayHello(String name);
}