CXF发布webService服务以及客户端调用
这篇随笔内容是CXF发布webService服务以及客户端调用的方法
CXF是什么?
开发工作之前需要下载CXF和安装
安装过程:
<1>下载解压到一个目录(不能有中文,特殊字符)
<2>配置环境变量(我使用的是2.6.15版本,针对不同的版本配置环境变量)
CXF_HOME=D:\DevIDE\Java\apache-cxf-2.6.15
path=%CXF_HOME%/bin;
<3>测试是否安装成功?
CXF安装好了,就可以进行webService的开发工作,不管用什么技术,尽量可以先参考官方文档
在cxf解压目录中有samples目录,都是参考例子
我们可以通过java工程来发布一个webService服务,也可以通过web工程发布一个webService服务,下面分别写一个Demo
通过java工程发布一个webService
1、创建一个java工程
2、导入jar包
将目录中的jar都引入到工程即可。(注意一个目录和一个which_jar不要拷贝进去)
3、写webservice接口类
1 package com.esb.ws.server; 2 3 import javax.jws.WebService; 4 5 @WebService 6 public interface MobileAddress { 7 public String getAddressByMobile(String mobile); 8 }
4、写一个sei,服务接口实现类
1 package com.esb.ws.server; 2 3 public class MobileAddressImpl implements MobileAddress { 4 5 @Override 6 public String getAddressByMobile(String mobile) { 7 return "电话号码"+mobile+"属于上海电信"; 8 } 9 }
5、发布服务
1 package com.esb.ws.server; 2 3 import org.apache.cxf.jaxws.JaxWsServerFactoryBean; 4 5 public class CXFServer { 6 public static void main(String[] args) { 7 //三步走 8 //1、实例化一个jaxws服务工厂 9 JaxWsServerFactoryBean sf = new JaxWsServerFactoryBean(); 10 11 //设置三个属性 12 //2.1设置SEI接口的class 13 sf.setServiceClass(MobileAddress.class); 14 //2.2设置SEI的实现者 15 sf.setServiceBean(new MobileAddressImpl()); 16 //2.3服务地址 17 sf.setAddress("http://127.0.0.1:8888/mobileService"); 18 19 //3创建并发布 20 sf.create(); 21 22 System.out.println("通过CXF创建服务成功!"); 23 } 24 }
测试的话可以通过访问http://127.0.0.1:8888/mobileService?wsdl
客户端程序开发
<1>生成桩,本地代理接口类(在dos窗口通过wsdl2java命令,具体的命令网上找)
将生成的类复制到工程中
2、编写客户端调用webservice服务
1 package com.esb.ws.client; 2 3 import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; 4 5 import com.esb.ws.server.MobileAddress; 6 7 public class CXFClient { 8 public static void main(String[] args) { 9 //三部走 10 //1、本地代理工厂实例 11 JaxWsProxyFactoryBean pf = new JaxWsProxyFactoryBean(); 12 13 //2、设置webservice服务端的地址,加上wsdl也可以 14 pf.setAddress("http://127.0.0.1:8888/mobileService"); 15 16 //3、创建的到本地代理类(桩) 17 MobileAddress address = pf.create(MobileAddress.class); 18 19 String result = address.getAddressByMobile("181xxxx7433"); 20 21 System.out.println(result); 22 } 23 }
打印结果:
通过web发布webService
Web服务发布webService,是将webservice服务和普通的web服务一起启动,也就是说使用tomcat启动webservice服务,而不是通过main方法。这里介绍的是CXF与Spring整合,使用web容器启动,然后spring容器起来,spring容器管理者webservice服务类
官方Demo,参考sample目录下的java_first_spring_support
webService服务端开发:
<1>新建web工程
<2>导入jar包
Spring的核心包+CXF相关和依赖
在CXF安装包解压目录下的lib目录下的jar包全部导入即可,需要注意的是:如果你的项目用的新版本,那么这里的spring的包就别拷贝了
<3>接口类,并在接口类加上注解
1 package com.esb.ws.server; 2 3 import javax.jws.WebMethod; 4 import javax.jws.WebParam; 5 import javax.jws.WebResult; 6 import javax.jws.WebService; 7 import javax.xml.ws.BindingType; 8 9 @WebService(name="MobileAddress" 10 ,serviceName="MobileAddressService" 11 ,portName="MobileAddressPort" 12 ,targetNamespace="http://ws.esb.com/" 13 ) 14 @BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING) 15 public interface MobileAddress { 16 17 @WebMethod(operationName="getAddressbyMobileNo") 18 public @WebResult(name="address")String getAddressByMobile(@WebParam(name="mobileNo")String mobile); 19 }
<4>接口实现类
1 package com.esb.ws.server; 2 3 public class MobileAddressImpl implements MobileAddress { 4 5 @Override 6 public String getAddressByMobile(String mobile) { 7 return "电话号码"+mobile+"属于上海电信"; 8 } 9 10 }
<5>配置web.xml文件,目的就是为了web容器启动时,初始化CXF服务,是web服务发布webService的连接点。
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>WebService_CXF_Web</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>cxf</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>cxf</servlet-name> <url-pattern>/ws/*</url-pattern> </servlet-mapping> </web-app>
<6>配置CXF服务端的配置文件
分析源代码可以得出默认情况下,加载/WEB-INF/cxf-servlet.xml
配置cxf-servlet.xml文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:soap="http://cxf.apache.org/bindings/soap" xmlns:jaxrs="http://cxf.apache.org/jaxrs" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd "> <!-- jaxws:server代表org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean,服务实例工厂 等价于JaxWsServiceFactoryBean jf = new JaxWsServiceFactoryBean(); address:写服务的相对路径 serviceClass:sei接口类 jaxws:serviceBean:sei的实现类 --> <jaxws:server address="/mobile" serviceClass="com.esb.ws.server.MobileAddress"> <jaxws:serviceBean> <ref bean="mobileAddress"/> </jaxws:serviceBean> </jaxws:server> <bean id="mobileAddress" class="com.esb.ws.server.MobileAddressImpl"></bean> </beans>
<7>发布服务,启动tomcat
测试OK?
浏览器访问 http://localhost:8080/WebService_CXF_Web/ws/mobile?wsdl(自己发布的地址)
开发客户端调用webService
<1>生成桩,获取接口代理类
拷贝生成的类到客户端工程
2、配置客户端的bean
配置文件:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" 4 xmlns:soap="http://cxf.apache.org/bindings/soap" xmlns:jaxrs="http://cxf.apache.org/jaxrs" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://cxf.apache.org/bindings/soap 8 http://cxf.apache.org/schemas/configuration/soap.xsd 9 http://cxf.apache.org/jaxws 10 http://cxf.apache.org/schemas/jaxws.xsd 11 http://cxf.apache.org/jaxrs 12 http://cxf.apache.org/schemas/jaxrs.xsd 13 "> 14 <jaxws:client id="mobileAddress" address="http://localhost:8080/WebService_CXF_Web/ws/mobile" serviceClass="com.esb.ws.stub.MobileAddress"> 15 16 </jaxws:client> 17 </beans>
<3>客户端调用webService
1 package com.esb.ws.client; 2 3 import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; 4 import org.junit.Test; 5 import org.springframework.context.ApplicationContext; 6 import org.springframework.context.support.ClassPathXmlApplicationContext; 7 8 import com.esb.ws.stub.MobileAddress; 9 10 public class WebServiceCXFClient { 11 @Test 12 public void wsCXFTest(){ 13 ApplicationContext context = new ClassPathXmlApplicationContext("client-beans.xml"); 14 MobileAddress mobileAddress = (MobileAddress)context.getBean("mobileAddress"); 15 String result = mobileAddress.getAddressbyMobileNo("181xxxx7433"); 16 17 System.out.println(result); 18 } 19 20 }
当然也可以使用和前面一样的方法(不使用spring获取服务接口代理类)调用webService
package com.esb.ws.client; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.esb.ws.stub.MobileAddress; public class WebServiceCXFClient { @Test public void wdCXFTest2(){ JaxWsProxyFactoryBean ps = new JaxWsProxyFactoryBean(); ps.setAddress("http://localhost:8080/WebService_CXF_Web/ws/mobile"); ps.setServiceClass(MobileAddress.class); MobileAddress mobileAddress = (MobileAddress)ps.create(); String result = mobileAddress.getAddressbyMobileNo("181xxxx7433"); System.out.println(result); } }
简单的Demo就是这些了。
jax-ws也可以开发webService,为什么使用CXF
jax-ws的优点,就是jdk自带的,速度较快,但是开发麻烦,比如一些日志功能,web集成功能,以及与spring集成稍微麻烦
CXF可以解决,整合日志拦截器、天生和spring是整合的、还整合了其他一些功能。
作为一个java小白,写写随笔,整理下知识点,积累下知识点。