使用CXF框架,发布webservice服务,并使用客户端远程访问webservice

时间:2021-06-22 18:10:50

使用CXF框架,发布webservice服务,并使用客户端远程访问webservice
  1. CXF介绍 :soa的框架
    * cxf 是 Celtrix (ESB框架)和 XFire(webserivice) 合并而成,并且捐给了apache  
    * CxF的核心是org.apache.cxf.Bus(总线),类似于Spring的 ApplicationContext
    * CXF默认是依赖于Spring的
    * Apache CXF 发行包中的jar,如果全部放到lib中,需要 JDK1.6 及以上,否则会报JAX-WS版本不一致的问题
    * CXF 内置了Jetty服务器 ,它是servlet容器,好比tomcat
  2.CXF特点
    1. 与Spring、Servlet做了无缝对接,cxf框架里面集成了Servlet容器Jetty
    2. 支持注解的方式来发布webservice
    3. 能够显示一个webservice的服务列表
    4. 能够添加拦截器:输入拦截器、输出拦截器 :
         输入日志信息拦截器、输出日志拦截器、用户权限认证的拦截器

CXF框架概念介绍

   通过cxf框架发布webservice
1. ServerFactoryBean
- 不设置注解也可以发布webservice服务, 不支持注解
- 不支持拦截器的添加
2. JaxWsServerFactoryBean
- 支持注解
- 可以添加拦截器
3. webservice 访问流程:
1. 检测本地代理描述的wsdl是否与服务端的wsdl一致 ,俗称为握手
2. 通过soap协议实现通信 ,采用的是post请求 , 数据封装在满足soap规约的xml中
3. 返回数据 同样采用的是soap通信, 数据封装在满足soap规约的xml中

  Apache CXF 是一个开源的 Services 框架,CXF 帮助您来构建和开发 Services 这些 Services 可以支持多种协议,比如:SOAP、POST/HTTP、RESTful HTTP CXF 大大简化了 Service可以天然地和 Spring 进行无缝集成。

 0.jar包:

aaarticlea/png;base64,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" alt="" />

1.ServerFactoryBean来发布web服务

服务类代码如下:(注解无效)

接口:

package cn.it.ws.cxf.a;

import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
@WebService(serviceName="languageManager")
public interface LanguageService {
public String getLanguage(int position); }

实现类及发布:

package cn.it.ws.cxf.a;

import org.apache.cxf.frontend.ServerFactoryBean;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean; /**开发语言排行描述服务
*
*
*/
public class LanguageServiceImpl implements LanguageService {
/* (non-Javadoc)
* @see cn.it.ws.cxf.a.LanguageService#getLanguage(int)
*/
@Override
public String getLanguage(int position){
String language=null;
switch (position) {
case 1:
language="java";
break;
case 2:
language="C";
break;
case 3:
language="Objective-C";
break;
case 4:
language="C#";
break; default:
break;
}
return language;
}
/**通过cxf框架发布webservice
* 1. ServerFactoryBean
* - 不设置注解也可以发布webservice服务, 不支持注解
* - 不支持拦截器的添加
* 2. JaxWsServerFactoryBean
* - 支持注解
* - 可以添加拦截器
* 3. webservice 访问流程:
* 1. 检测本地代理描述的wsdl是否与服务端的wsdl一致 ,俗称为握手
* 2. 通过soap协议实现通信 ,采用的是post请求 , 数据封装在满足soap规约的xml中
* 3. 返回数据 同样采用的是soap通信, 数据封装在满足soap规约的xml中
* @param args*/ public static void main(String[] args) {
LanguageService languageService=new LanguageServiceImpl();
ServerFactoryBean bean=new ServerFactoryBean();
//Endpoint :地址 , 实现对象
bean.setAddress("http://127.0.0.1:9999/ws/cxf/languangeService");
bean.setServiceClass(LanguageService.class);//对外提供webservcie的业务类或者接口
bean.setServiceBean(languageService);//服务的实现bean
bean.create();//创建,发布webservice
System.out.println("wsdl地址:http://127.0.0.1:9999/ws/cxf/languangeService?WSDL");
} }

测试:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdQAAAFLCAIAAADgdeqtAAAgAElEQVR4nO2dyXLkRram8TTc4j34DngFPgO3WNBiLbPuWJVVq9iyUHT3plRaMG9pyKoymfW93XGpKTOZM5OZGkkmUzdvl7wXmM7kDkdMHsP/WZiURAAOx/TBceDhJ3sDAABg7WT/5Q//HR988MEHnzV/svcAAADWTnYHAABg7UC+AACQAMgXAAAS0CPfH3/6+cXl1aMnzx9cPP3mwcU3Dy4eXDx99OT5i8urH3/6eT1VBACA3cOW783t7YvLq28fPH5w8ezy6s3Pv/x6fX3z9u3d27d319c3P/38y+XVm4ePn33z4OLF5dXN7e2aKw0AANuOId/LqzffPnz89MXl9c3NuyC3t2+fv3z1zYPHLy6vbqFgAACIhsn35vb24ZNnj54879Uu5frm5vGzlw8fP7u+uUm1GQAAsF108v35l1++e/TkxeXV3d1dvHkr7u7uXly+/vO9+//tf/zlw//5KT744IMPPuFPLd/rm5tvHly8unozVLuUNz/8+N2jJ+9++4//BwAAIEgt34ePnz17cbmIeSteXF49fvbyn//8pwMAAOAnu7u7e/nq9cPHz+aINphcPH1x9ebHVdT19evXqygWAADWT3Z9c/P19xfX11Fv2J4/f/7ixcvwPDc3t98+fPIf7/9z6XWdzWZLLxMAAJKQPX/56unzqIDDgwcPP//y/udf3H/y5GmPo1++evGqv5V6eXl5//79jz766KOPPrp///6rV6/C80O+AICdIfv6+4uYjmW1eb+8//mX97+4/7dwjOL29vbr7y9+//1331pvbm4++eSTzz777PXr17/99ttvv/32+vXrv/71r3/+859vbm58S0G+AICdIfv+0ZNB5v38y/tPnva0fN+9e/fw8bOb27fmKq+vr09PT9+8eaO/evPmzZ/+9Kfr62tzQcg3IeeT0fHx8fH4njFdTdwn7o2PR5Pz1LUAW0j28tXrYebtizlUvHz1+uUrQ6+///77X/7ylx9/7N7IffLJJ59++mn75w8//PDpp5+areaAfGdlnpfk22mR1TSTuyniC72M+qZaQf1tMfXUYVrY39XaOj5mF+m9cT2Rqit+Ylf03OYbZA1j5mrl2yvfwH4dWMww+bbnw2hyXv0lzwvxd/2nPo+6KXozcE/YfLKff/l1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" alt="" />

ServerFactoryBean注意事项:

这种方式没有添加webService注解,也就是说没有注解也可以发布webService服务,但是这种方式不是很规范,比如我们不可以通过注解的方式来修改WSDL的标签信息,

2.JaxWsServerFactoryBean来发布web服务

  1. JaxWsServerFactoryBean是ServerFactoryBean的子类,也是功能扩展类。
  2. 此类,必须要在被发布为服务的类上添加@WebService注解,如果不加注解,虽然不出错,但也不会对外暴露任何方法。使用此类生成的wsdl文件更加规范
  3. 更重要的是可以通过添加拦截器拦截请求.

接口:

package cn.it.ws.cxf.a;

import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService; @WebService(serviceName="languageManager")
public interface LanguageService {
public @WebResult(name="language")String getLanguage(@WebParam(name="position")int position); }

实现类及发布:

package cn.it.ws.cxf.a;

import org.apache.cxf.frontend.ServerFactoryBean;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean; /**开发语言排行描述服务
*
*
*/
public class LanguageServiceImpl implements LanguageService {
/* (non-Javadoc)
* @see cn.it.ws.cxf.a.LanguageService#getLanguage(int)
*/
@Override
public String getLanguage(int position){
String language=null;
switch (position) {
case 1:
language="java";
break;
case 2:
language="C";
break;
case 3:
language="Objective-C";
break;
case 4:
language="C#";
break; default:
break;
}
return language;
} public static void main(String[] args) {
LanguageService languageService=new LanguageServiceImpl();
JaxWsServerFactoryBean bean=new JaxWsServerFactoryBean();
//Endpoint :地址 , 实现对象
bean.setAddress("http://127.0.0.1:9999/ws/cxf/languangeService");
bean.setServiceClass(LanguageService.class);//对外提供webservcie的业务类或者接口
bean.setServiceBean(languageService);//服务的实现bean
//添加输入拦截器 :输入显示日志信息的拦截器
bean.getInInterceptors().add(new LoggingInInterceptor());
//添加输出拦截器 :输出显示日志信息的拦截器
bean.getOutInterceptors().add(new LoggingOutInterceptor()); bean.create();//创建,发布webservice
System.out.println("wsdl地址:http://127.0.0.1:9999/ws/cxf/languangeService?WSDL");
} }

测试:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAycAAAGGCAIAAADuFGmcAAAgAElEQVR4nO29687kxnX3y6uZr7yPuQfewlxDx4iREPC44Y8GNvpTEDizjTaDOEAUw7u1fZKTrb33++6XeSzLI41G0mg0knWaGY0cxXHtD6zDWqtWFYvsbj59+P/wANLwUCwWD/XrVYtk9b/93f+OP/zhD3/4wx/+8Ie/Y/9V3wIAAAAAgONTvQIAAAAAAMcH1gUAAAAAsASwLgAAAACAJZhsXZ99/sWTp8/effzhw0fvv/Xw0VsPHz189P67jz988vTZZ59/cYwqAgAAAABcAKXW9eLlyydPn/3+4XsPH33w9NmnX3z51fPnL77++tXXX796/vzF5198+fTZp++898FbDx89efrsxcuXR600AAAAAMDZUWRdT599+vt33nv/ydPnL158k+Xly68//Ojjtx6+9+Tps5dwLwAAAAAAx4h1vXj58p3HH7z7+MNR36I8f/HivQ8+eue9D56/eLHMbgAAAAAAnDg56/riyy/ffvfxk6fPXr16Va5cA69evXry9JNf/Pb/+dkv/v3/+PWb+MMf/vCHP/zhD3/X8/d//Y//mGBdz1+8eOvho4+ffTrVtyif/vGzt999/M2f/vPPAAAAAABXw2v/528nWNc7733wwZOn+yjXwJOnz9774KP//u//NgAAAAAA18EE6/ro40/eee+DGQOLKo/ef/Ls08+OsUuffPLJMYoFAAAAwAWzgD+UWtfzFy9+94dHz58Xpc9/+OGHT558lF/mxYuXv3/n8X9++18H36W+7w9eJgAAAAAumwX8odS6Pvzo4/c/LBpbfPjwnV/95o1f/fqNx4/fH5Gzjz5+8vG4Vz59+vSNN9748Y9//OMf//iNN974+OOP88vDugAAAAAwlROyrt/94VHJeyKscv3mjV/95o1fv/Hb/HDky5cvf/eHR3/5y19SlXvx4sVrr732y1/+8pNPPvnTn/70pz/96ZNPPvnFL37xL//yLy9evEitBesCAAAAwFT29Ief//zno8sUWddnn3/xh3cfT1KuX/3mjcfvj8S6vvnmm3fe++DFy6/Vmj1//vzBgweffvppPOvTTz/9h3/4h+fPn6srwrpukZvterVarTavK9OjidfE65vVentz27UAAACQptAfPvvss67rvve9761Wq+9973td133+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*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" alt="" />

3.生成本地代理以及打包测试:

C:\Users\liqiang\Desktop>wsimport http://127.0.0.1:9999/ws/cxf/languangeService?
WSDL
parsing WSDL... Generating code... Compiling code... C:\Users\liqiang\Desktop>jar -cvf Language.jar ./cn
已添加清单
正在添加: cn/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: cn/it/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: cn/it/ws/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: cn/it/ws/cxf/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: cn/it/ws/cxf/a/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: cn/it/ws/cxf/a/GetLanguage.class(输入 = 617) (输出 = 376)(压缩了 39%)
正在添加: cn/it/ws/cxf/a/GetLanguageResponse.class(输入 = 692) (输出 = 390)(压缩
了 43%)
正在添加: cn/it/ws/cxf/a/LanguageManager.class(输入 = 2325) (输出 = 1044)(压缩了
55%)
正在添加: cn/it/ws/cxf/a/LanguageService.class(输入 = 806) (输出 = 439)(压缩了 4
5%)
正在添加: cn/it/ws/cxf/a/ObjectFactory.class(输入 = 1647) (输出 = 673)(压缩了 59
%)
正在添加: cn/it/ws/cxf/a/package-info.class(输入 = 242) (输出 = 198)(压缩了 18%) C:\Users\liqiang\Desktop>

测试代码:

import cn.it.ws.cxf.a.LanguageManager;
import cn.it.ws.cxf.a.LanguageService; public class _Main { public static void main(String[] args) {
// TODO Auto-generated method stub
LanguageManager lManager = new LanguageManager();
LanguageService languageServicePort = lManager.getLanguageServicePort();
String language = languageServicePort.getLanguage(1);
System.out.println(language); } }

客户端console:

java

服务端console:(握手,接收请求,发送数据(soap))

九月 22, 2017 12:25:56 下午 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
信息: Inbound Message
----------------------------
ID: 4
Address: http://127.0.0.1:9999/ws/cxf/languangeService?WSDL
Http-Method: GET
Content-Type:
Headers: {Accept=[text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2], connection=[keep-alive], Content-Type=[null], Host=[127.0.0.1:9999], User-Agent=[Java/1.7.0_80]}
--------------------------------------
九月 22, 2017 12:25:58 下午 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
信息: Inbound Message
----------------------------
ID: 5
Address: http://127.0.0.1:9999/ws/cxf/languangeService
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml; charset=UTF-8
Headers: {Accept=[text/xml, multipart/related], connection=[keep-alive], Content-Length=[208], content-type=[text/xml; charset=UTF-8], Host=[127.0.0.1:9999], SOAPAction=[""], User-Agent=[JAX-WS RI 2.2.4-b01]}
Payload: <?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:getLanguage xmlns:ns2="http://a.cxf.ws.it.cn/"><position>1</position></ns2:getLanguage></S:Body></S:Envelope>
--------------------------------------
九月 22, 2017 12:25:59 下午 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
信息: Outbound Message
---------------------------
ID: 5
Encoding: UTF-8
Content-Type: text/xml
Headers: {}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:getLanguageResponse xmlns:ns2="http://a.cxf.ws.it.cn/"><language>java</language></ns2:getLanguageResponse></soap:Body></soap:Envelope>
--------------------------------------