什么是CXF:
Apache CXF = Celtix + Xfire
支持多种协议:
SOAP1.1,1.2
XML/HTTP
CORBA(Common Object Request broker Architecture公共对象请求代理体系结构,早期语言使用的WS。 C,c++,C#)
并可以与Spring进行快速无缝的整合
灵活的部署:可以运行在Tomcat,Jboss,Jetty(内置),IBMWS,BeaWL上面。
安装CXF的其他支持项目:
Ant
Tomcat
并设置以下环境变量:
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
在Eclipse中开发CXF的JavaSE应用:
导入CXF中的 所有jar文件。可以通过WACH_JARS来观察各jar文件的用途。
建立好之后的项目如图所示:
CXF发布服务的类:
用两个不同的类发布应用:
Serverfactorybean -- FacotryBean
JaxWsServerfactorybean(建议使用此类)
使用Serverfactorybean发布服务:
/** * 使用Serverfactorybean发布CXF的javase应用 * @author zhaoqx * */ public class HelloService { public String sayHello(String name){ System.out.println("sayHello called..."); return "hello " + name; } static void main(String[] args) { Serverfactorybean bean = new Serverfactorybean(); bean.setAddress("http://192.168.1.24:9999/Hello"); bean.setServiceClass(HelloService.class); bean.setServiceBean(new HelloService()); bean.create(); System.err.print("启动成功"); } }
使用ClientProxyfactorybean客户端调用
使用Serverfactorybean发布服务以后,在没有接口的情况下,可以使用wsimport生成的客户端代码调用成功。
但如果要使用ClientProxyfactorybean客户端去调用服务器,则必须要先在服务器端创建一个接口。(一直以来,Spring都要 求面向接口编程,而cxf与Spring能很好的整合,也就在此。),所以,必须要重写服务器端的代码。这将导致刚才使用wsimport生成的调用代码 失效。
同时, ClientProxyfactorybean由于要用到CXF环境,所以要导入CXF的所有包。
同时,如果是在本项目中调用,则可以直接使用本项目的接口。
如果在其他项目中调用,仍然需wsimport生成的类,但只需要一个接口。
使用JaxWsServerfactorybean发布服务: (建议使用此类)
JaxWsServerfactorybean是Serverfactorybean的子类,也是功能扩展类。但在CXF的api文档中没有提供此类API,请通过查看源代码的方式获取此类的帮助。此类,必须要在被发布为服务的类上添加@WebService注解,如果不加注解,虽然不出错,但也不会对外暴露任何方法。使用此类生成的wsdl文件更加规范。
@WebService //@javax.xml.ws.BindingType(value=javax.xml.ws.soap.soAPBinding.soAP12HTTP_BINDING) class HiService { public String sayHi(String name){ System.out.println("服务调用"); return "Hi"+name; } void main(String[] args) { JaxWsServerfactorybean bean = new JaxWsServerfactorybean(); bean.setAddress("http://localhost:9999/two"); bean.setServiceClass(HiService.new HiService()); bean.create(); System.err.print("服务启动成功"); } }
class IHelloServiceImpl implements IHelloService { public String sayHello(String name) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return sdf.format(new Date())+"=== hello=====" + name; } new JaxWsServerFactoryBean(); bean.setAddress("http://192.168.1.24:8888/sayHi"); bean.setServiceClass(IHelloService.new IHelloServiceImpl()); 加入请求消息拦截器 bean.getInInterceptors().add(new LoggingInInterceptor()); 加入响应消息拦截器 bean.getOutInterceptors().add(new LoggingOutInterceptor()); bean.create(); System.err.print("服务启动成功"); } }