1、记得调整你的jdk版本为jdk1.6.0_24.
2、将所有cxf的jar包拷贝到项目中来。添加到classpth中。
3、在开发之前可以先阅读CXF_HOME\lib\WATCH_JARS文件,分析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生成了客户端代码。
以下是源代码:
/**
* 不管是用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..."); } }
总结:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。