原创作者: 尹标平
阅读:5622次
评论:7条
更新时间:2014-03-22
本文重点介绍bbossgroups webservice服务定义、服务配置、服务发布、服务定义几部分内容。
配置cxf组件工厂创建webservice客服端调用组件
配置cxf组件工厂创建webservice客服端调用组件
利用aop框架中的工厂组件管理模式,可以非常方便的获取cxf webservice服务的客服端调用接口,从而方便地实现webservice服务调用。
14.9.2.1 客服端配置文件
下面的配置和上面的配置等价:
说明:
WSServiceClient-代表webservice服务客服端接口组件名称,客服端调用程序通过该名称获取服务调用接口实例,该实例通过工厂模式(组件创建工厂
WSServiceClientFactory的create方法创建)获取。
WSServiceClientFactory-组件创建工厂(非静态),webservice客服端通过该工厂的create实例方法来创建服务调用接口实例。在该工厂的定义中可以看出,为了创建webservice服务调用接口,需要指定两个属性serviceClass和address,通过serviceClass属性指定了webservice服务对应的接口,address指定了webservice服务地址。
利用aop框架中的工厂组件管理模式,可以非常方便的获取cxf webservice服务的客服端调用接口,从而方便地实现webservice服务调用。
14.9.2.1 客服端配置文件
<properties> <property name="WSServiceClient" factory-bean="WSServiceClientFactory" factory-method="create"/> <property name="WSServiceClientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"> <property name="serviceClass" value="org.frameworkset.web.ws.WSService"/> <property name="address" value="http://localhost:8080/bboss-mvc/cxfservices/mysfirstwsservicePort"/> </property> </properties>
下面的配置和上面的配置等价:
<properties> <property name="WSServiceClient" factory-class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean" factory-method="create" f:serviceClass="org.frameworkset.web.ws.WSService" f:address="http://localhost:8080/bboss-mvc/cxfservices/mysfirstwsservicePort"/> </properties>
说明:
WSServiceClient-代表webservice服务客服端接口组件名称,客服端调用程序通过该名称获取服务调用接口实例,该实例通过工厂模式(组件创建工厂
WSServiceClientFactory的create方法创建)获取。
WSServiceClientFactory-组件创建工厂(非静态),webservice客服端通过该工厂的create实例方法来创建服务调用接口实例。在该工厂的定义中可以看出,为了创建webservice服务调用接口,需要指定两个属性serviceClass和address,通过serviceClass属性指定了webservice服务对应的接口,address指定了webservice服务地址。
调用方法
调用方法
public class WSClient { ApplicationContext context ; @Before public void init() { context = ApplicationContext.getApplicationContext("org/frameworkset/web/ws/wsclient.xml"); } @Test public void test() { org.frameworkset.web.ws.WSService wsservice = (WSService)context.getBeanObject("WSServiceClient"); System.out.println(wsservice.sayHello("多多")); } }
服务发布
webservice服务装载功能,可以从mvc控制器配置文件和所有的applicationcontext对应的配置文件中配置和装载webservice服务:
在Mvc框架控制器文件中配置的ws服务会在webservice引擎启动时自动装载。
普通的applicationcontext容器对应的配置文件中配置的ws服务不能自动加载,我们需要将这些配置文件单独装配到
org/frameworkset/spi/ws/webserivce-modules.xml文件中,以便webservice引擎启动时通过扫描org/frameworkset/spi/ws/webserivce-modules.xml中装配的组件配置文件来装载其中配置的webservice服务。
org/frameworkset/spi/ws/webserivce-modules.xml文件时3.1版本中新加的用来装配独立applicationcontext中配置的ws服务的部署描述文件。
org/frameworkset/spi/ws/webserivce-modules.xml装载服务实例
在Mvc框架控制器文件中配置的ws服务会在webservice引擎启动时自动装载。
普通的applicationcontext容器对应的配置文件中配置的ws服务不能自动加载,我们需要将这些配置文件单独装配到
org/frameworkset/spi/ws/webserivce-modules.xml文件中,以便webservice引擎启动时通过扫描org/frameworkset/spi/ws/webserivce-modules.xml中装配的组件配置文件来装载其中配置的webservice服务。
org/frameworkset/spi/ws/webserivce-modules.xml文件时3.1版本中新加的用来装配独立applicationcontext中配置的ws服务的部署描述文件。
org/frameworkset/spi/ws/webserivce-modules.xml装载服务实例
<properties> <!-- webservice服务组件装配文件,每个文件作为单独的容器来处理,这里装配的是classpath上下文中需要独立加载的webservice服务 mvc框架中需要加载的webservice服务只需要在对应的组件中标注servicePort即可,当webservice引擎启动时会加载这两种模式下的 所有webservice服务 需要注意的是,webservice引擎需要在mvc框架启动后在启动 --> <property name="cxf.webservices.modules"> <array componentType="String"> <property value="org/frameworkset/spi/ws/protocol-ws.xml"/> </array> </property> <!-- 本组件依赖于bboss-mvc.jar --> <property name="webapplicationcontext" factory-class="org.frameworkset.web.servlet.support.WebApplicationContextUtils" factory-method="getWebApplicationContext"/> </properties>
服务定义
3.1版本中标识webservice服务的属性变更为ws: servicePort,服务发布引擎通过识别带ws:前缀的属性来识别webservice服务,并发布该服务,例如:
<property name="rpc.webservice.RPCCall" singlable="true" ws:servicePort="RPCCallServicePort" class="org.frameworkset.spi.remote.webservice.RPCCall"/>
服务组件和接口实现
服务组件和接口实现
服务接口
服务组件实现
服务接口
package org.frameworkset.web.ws; import javax.jws.WebService; /** * <p>Title: WSService.java</p> * <p>Description: </p> * <p>bboss workgroup</p> * <p>Copyright (c) 2008</p> * @Date 2011-4-24 * @author biaoping.yin * @version 1.0 */ @WebService(name="WSService",targetNamespace="org.frameworkset.web.ws") public interface WSService { public String sayHello(@WebParam(name = "duoduo", partName = "partDuoduo") String duoduo) ; }
服务组件实现
package org.frameworkset.web.ws; import javax.jws.WebService; /** * <p>Title: WSServiceImpl.java</p> * <p>Description: </p> * <p>bboss workgroup</p> * <p>Copyright (c) 2008</p> * @Date 2011-4-24 * @author biaoping.yin * @version 1.0 */ @WebService(name="WSService",targetNamespace="org.frameworkset.web.ws") public class WSServiceImpl implements WSService{ public String sayHello(@WebParam(name = "duoduo", partName = "partDuoduo") String duoduo) { System.out.println("ModuleService欢迎您!" + duoduo); return "ModuleService欢迎您!" + duoduo; } }
服务实例的配置和装载
服务配置文件内容-新建文件resources/org/frameworkset/web/ws/testwsmodule.xml
服务配置文件装配-修改resources/org/frameworkset/spi/ws/webserivce-modules.xml文件
客服端配置:
<properties> <property name="mysfirstwsservice" ws:servicePort="mysfirstwsservicePort" class="org.frameworkset.web.ws.WSServiceImpl"/> </properties>
服务配置文件装配-修改resources/org/frameworkset/spi/ws/webserivce-modules.xml文件
<properties> <!-- webservice服务组件装配文件,每个文件作为单独的容器来处理,这里装配的是classpath上下文中需要独立加载的webservice服务 mvc框架中需要加载的webservice服务只需要在对应的组件中标注servicePort即可,当webservice引擎启动时会加载这两种模式下的 所有webservice服务 需要注意的是,webservice引擎需要在mvc框架启动后在启动 --> <property name="cxf.webservices.modules" > <array componentType="String"> <property value="org/frameworkset/web/ws/testwsmodule.xml"/> </array> </property> <!-- 本组件依赖于bboss-mvc.jar --> <property name="webapplicationcontext" factory-class="org.frameworkset.web.servlet.support.WebApplicationContextUtils" factory-method="getWebApplicationContext"/> </properties>
客服端配置:
<properties> <property name="WSServiceClient" factory-bean="WSServiceClientFactory" factory-method="create"/> <property name="WSServiceClientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"> <property name="serviceClass" value="org.frameworkset.web.ws.WSService"/> <property name="address" value="http://localhost:8080/bboss-mvc/cxfservices/mysfirstwsservicePort"/> </property> </properties>
客服端调用服务
客服端调用服务
package org.frameworkset.web.ws; import org.frameworkset.spi.ApplicationContext; import org.junit.Before; import org.junit.Test; /** * <p>Title: WSClient.java</p> * <p>Description: </p> * <p>bboss workgroup</p> * <p>Copyright (c) 2008</p> * @Date 2011-4-28 下午01:59:19 * @author biaoping.yin * @version 1.0 */ public class WSClient { ApplicationContext context ; @Before public void init() { context = ApplicationContext.getApplicationContext("org/frameworkset/web/ws/wsclient.xml"); } @Test public void test() { org.frameworkset.web.ws.WSService wsservice = (WSService)context.getBeanObject("WSServiceClient"); System.out.println(wsservice.sayHello("多多")); } }
webservice引擎配置web.xml
在web.xml文件中添加cxf webservice引擎servlet,这样服务就会被发布到cxf webservice引擎中:
这里需要说明的是cxf webservice引擎servlet的必须在mvc servlet加载之后加载,这样才能发布到mvc框架中配置的webservice服务
<servlet> <display-name>cxf</display-name> <servlet-name>cxf</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.RPCCXFServlet</servlet-class> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>cxf</servlet-name> <url-pattern>/cxfservices/*</url-pattern> </servlet-mapping>
这里需要说明的是cxf webservice引擎servlet的必须在mvc servlet加载之后加载,这样才能发布到mvc框架中配置的webservice服务
7 楼 czhx1121 2015-09-06 18:14
现在CXF已经是3.1.x,是否支持呢?
找找资料发现前端调研有三种:
1、JaxWsProxyFactoryBean 利用生成的class
2、DynamicClientFactory 在执行时在临时文件夹下生成需要的class
3、HttpClient 在试用中没能成功调用,返回值200,请教下如何实现
6 楼 yin_bp 2015-08-28 17:44
如果你想用cxf 官方的客户端工具类来生成服务客户端,就需要:
org.apache.cxf.jaxws.JaxWsProxyFactoryBean
否则直接通过wsdl生成服务客户端的话,就不需要引用cxf服务端的包了
5 楼 czhx1121 2015-08-28 16:27
4 楼 yin_bp 2015-05-18 14:42
不需要,只要可以被cxf解析
3 楼 huazi221 2015-05-18 13:10
2 楼 yin_bp 2014-03-17 11:13
接口参数要统一添加注解,否则wsdl中没有参数名称:
1 楼 yin_bp 2013-06-18 20:01
定义服务实现和服务接口:
接口:
实现:
服务部署
在mvc控制器配置文件中添加组件并指定ws:servicePort属性即可:
如果服务中需要注入业务组件,可以利用ioc属性注入进行注入即可。这样启动应用后,通过以下地址就可以生成webservice的客户端调用程序(也可以用正文中描述的几种方法进行调用):
http://localhost:8080/bboss-mvc/cxfservices/mysfirstwsservicePort
bboss-mvc就是应用的上下文,可以指定成你自己的应用上下文,mysfirstwsservicePort就是服务上的ws:servicePort指定值。