WebService-CXF发布javaSE项目
1、记得调整你的jdk版本为jdk1.6.0_24. 2、将所有cxf的jar包拷贝到项目中来。添加到classpth中。 3、在开发之前可以先阅读CXF_HOMElibWATCH_JARS文件,分析jar文件之间的依赖关系。鉴于简单开发,所以直接都拷贝过来。 ??? (在我的项目当中已经去除了一些jar文件。) CXF发布服务的类:
用两个不同的类发布应用:
ServerFactoryBean?? -- FacotryBean
JaxWsServerFactoryBean(建议使用此类)
服务与客户端类调用原则:使用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客户端调用
l
此调用过程与
ClientProxyFactoryBean
的要求一样,也必须要拥有一个接口。
l
此时,仍然可以使用
wsimport
生成接口,在其他项目的调用。
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生成客户代码:
在cxf中,也提供了一个用于生成客户端调用代码的工具。它的功能就如同wsimport一样。
先让我们了解一下cxf的wsdl2java工具,可以生成一堆客户端调用的代码。
此工具位于cxf_home/bin目录下。参数与wsimport有所不同。
它包含以下参数:
?-d参数,指定代码生成的目录。
?-p参数,指定生成的新的包结构。
需要说明的是,由于wsdl2java是根据jdk1.7生成的本地代码,所以,需要对生成的代码做一点点修改。
在命令行执行:
? 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..."); } } 总结:
l
如何通过
ant
发布第一个
cxf
应用。
l
手工建立一个
java
项目发布
cxf
的
ws
.
l
Java
项目和
js
访问
webService
l
加入消息拦截器
l
将服务端改为
SOAP1.2
实现 ?
@WebService @BindingType(value=SOAPBinding.SOAP12HTTP_BINDING) /** * 通过@BindingType(value=SOAPBinding.SOAP12HTTP_BINDING)转换为实现SOAP1.2 */ public interface IHelloService { public String sayHello(String name); }
l
SOAP1.1
与
1.2
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |