【Java EE 学习 81】【CXF框架】【CXF整合Spring】
2016-01-01 19:25
1006 查看
一、CXF简介
CXF是Apache公司下的项目,CXF=Celtix+Xfire;它支持soap1.1、soap1.2,而且能够和spring进行快速无缝整合。另外jax-ws是Sun公司发布的一套开发WebService服务的标准。早期的标准如jax-rpc已经很少使用,而cxf就是在新标准jax-ws下开发出来的WebService,jax-ws也内置到了jdk1.6当中。
CXF官方下载地址:http://cxf.apache.org/download.html
下载完成之后,解压开压缩文件,可以发现有一个samples文件夹,在该文件夹中给出了非常多的例子用于研究CXF的使用方法。在CXF2.4.0中提供了Ant的配置运行方法,所以如果想要快速运行示例程序,就需要安装Ant环境,当然Tomcat环境、CXF环境肯定也是必不可少的。
Ant、Tomcat都是Apache公司的项目:
Ant下载地址:http://ant.apache.org/
设置环境变量:
JAVA_HOME CXF_HOME ANT_HOME CATALINA_HOME Path = %JAVA_HOME%\bin;%CXF_HOME%\bin;%CATALINA_HOME%\bin;%ANT_HOME%\bin CLASSPATH=.;%CXF_HOME%\lib\cxf-manifest.jar;.\build\classes
使用Ant运行第一个CXF示例(以2.4.0为例),打开samples/java_first_pojo文件夹,并在该文件夹中打开两个命令行窗口,分别输入
ant server
和
ant client
即可将示例运行起来,并看到服务端和客户端的控制台打印结果;但是注意jdk版本问题,最好使用jdk1.6,在jdk1.8的环境下运行不起来,jdk1.7没试过。
二、Java SE下构建CXF的应用
1.准备工作
将lib文件夹下所有的jar包都拷贝到工程中,并添加到classpath,jar包有很多,里面包括了以后需要的springjar包。2.拷贝完jar包之后就能够进行测试了
CXF发布WebService服务的方式有两种,一种是“简单服务发布”,另外一种是“复杂服务发布”(1)简单服务发布
使用ServerFactoryBean类实现,该类是核心类。package com.kdyzm.cxf.ws.server; import org.apache.cxf.frontend.ServerFactoryBean; public class CXFOneServer { public String sayHello(String hello){ System.out.println("接收到了请求的参数:"+hello); return hello; } public static void main(String[] args) { ServerFactoryBean bean=new ServerFactoryBean(); bean.setAddress("http://localhost:9090/hello"); //设置服务接口,如果没有接口,则为服务类 bean.setServiceClass(CXFOneServer.class); //设置服务实现类 bean.setServiceBean(new CXFOneServer()); bean.create(); System.out.println("服务发布成功!"); } }
使用该类的特点就是:
* 服务类可以不使用@WebService注解
* 就算该服务类没有提供对外服务的方法,该服务也能够发布成功
可以看出来在CXF环境下发布服务和在JDK环境下发布服务的特点是截然不同的。(2)复杂服务发布(推荐使用的服务发布方式)
复杂服务发布使用的核心类是JaxWsServerFactoryBean类,该类是ServerFactoryBean类的子类,同时也是功能扩展类,推荐使用该类发布服务,因为使用该类发布的服务生成的wsdsl文件更加规范。package com.kdyzm.cxf.ws.server; import javax.jws.WebService; import javax.xml.ws.BindingType; import javax.xml.ws.soap.SOAPBinding; import org.apache.cxf.interceptor.LoggingInInterceptor; import org.apache.cxf.interceptor.LoggingOutInterceptor; import org.apache.cxf.jaxws.JaxWsServerFactoryBean; /** * 发布服务的第二种方法,这种方式必须加上WebService注解,否则服务类中的方法不能暴露出来 * @author kdyzm *最好使用SOAP1.2,这样就算是SOAP1.1的客户端也能够正常访问服务 */ @WebService @BindingType(value=SOAPBinding.SOAP12HTTP_BINDING) public class CXFTwoServer { public String sayHello(String hello){ System.out.println("获取请求参数:"+hello); return hello; } public String calculate(int input){ return input*input+""; } public static void main(String[] args) { JaxWsServerFactoryBean bean=new JaxWsServerFactoryBean(); bean.setAddress("http://localhost:9000/helloworld"); bean.setServiceClass(CXFTwoServer.class); bean.setServiceBean(new CXFTwoServer()); //加上日志选项,能够清楚的查看到请求和相应的代码。 bean.getInInterceptors().add(new LoggingInInterceptor()); bean.getOutInterceptors().add(new LoggingOutInterceptor()); bean.create(); System.out.println("第二种方式服务发布成功!"); } }
使用JaxWsServerFactoryBean类发布服务的方式的特点是:
* 服务类必须使用@WebService注解,虽然不加上该注解也不会报错,但是服务类中的所有服务方法都不会暴露出来(wsdl文件中找不到对应的方法),这样实际上该服务类就没有什么作用了。
* 该类和ServerFactoryBean类相同,就算没有对外暴露服务方法,也能够将服务发布成功。
3.说明
(1)可以使用相关注解对服务类进行说明
强烈建议使用注解@BindingType(value=SOAPBinding.SOAP12HTTP_BINDING)将服务声明为符合SOAP1.2规范的服务。(2)通过加上一下两句代码可以对请求和响应的过程进行监听
这样就能够非常清楚的查看请求头信息、请求体信息、响应头信息和响应体信息了。bean.getInInterceptors().add(new LoggingInInterceptor()); bean.getOutInterceptors().add(new LoggingOutInterceptor());
package com.kdyzm.cxf.ws.server; import com.kdyzm.cxf.ws.server.inf.TwoServer; public class TwoServerImpl implements TwoServer{ @Override public String sayHello(String hello) { return "你好,hello"; } }
com.kdyzm.cxf.ws.server.TwoServerImpl
第四步:查看配置结果
1.查看所有服务的方法
可以通过在浏览器上输入:http://localhost:8080/cxf_server_web/cxf的方式查看发布的所有服务,内容如下:配置的两个服务都会罗列出来。
2.查看wsdl
可以单击上面的超链接查看,也可以直接输入地址查看,地址形式:http://localhost:8080/cxf_server_web/cxf/one?wsdl效果如下图所示:
第五步:根据wsdl生成本地调用代码
对于SOAP1.1来说,可以使用wsimport命令创建,但是对于SOAP1.2来说,wsimport命令无法解析,必须使用wsdl2java命令创建本地调用代码。第六步:使用本地调用代码调用WebService服务
调用的形式和方法和之前的方法一模一样,只需要查看wsdl文件一步一步的来就可以了,但是需要注意的是,CXF提供了它自己的一套客户端调用方法,但是非常麻烦,甚至还需要依赖于Spring的环境,所以不推荐使用这种方法,如果非要使用这种方法,还不如使用Spring的远程调用了。另外,CXF支持传输对象,使用方式和基本数据类型的使用方式一模一样,略。
相关文章推荐
- 【慕课笔记】第一章 JAVA初体验 第1节 JAVA平台应用
- java servlet Json.org.jar
- char字节数、char与byte、byte数组合并 Java
- java发送内嵌图片邮件
- sslsocket通信中的一些问题(JAVA)
- java设计模式之适配器模式
- java中split()方法分割字符串后数组长度问题
- 常用Myeclipse快捷键整理
- 解决切换jdk编译android源码错误
- java14.语言进阶------本地文件操作---文件属性的读取、设置
- Java对象的序列化和反序列化
- javascipt——原型
- java list的用法
- 第三章:通话连接的作用以及建立过程之四GsmCallTracker.java与RIL.java交互完成物理拨号
- Java:强引用、弱引用、软引用、虚引用
- 模板方法
- 第三章:通话连接的作用以及建立过程之三TelephonyConnectionService.java与RIL.java交互实现通话底层拨号功能
- 1.Spring IoC简单例子
- 第二章:CallsManager调用 startOutgoingCall开始拨号流程之四InCallController.java绑定InCallService.java实现进程间Binder通信
- java Set 用法