JaxWsServiceFactoryBean, 与JaxWsServerFactoryBean区别

本文解析了CXF中ServiceModel的概念及其组成部分,包括与WSDL类似的服务信息和服务自身的CXF运行时相关信息。同时介绍了ServiceModel在CXF API设计中的应用,并区分了JaxWsProxyFactoryBean和JaxWsServerFactoryBean的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在前面的文章中给大家简单介绍了CXF是如何和将一个POJO变成一个Web Services的,当中提到一个很重要的一个名词就是Sevices Model,现在我们就简单讨论一下CXF中有关Services Model的内容。

首先大家可以从 CXF的构架 上面获取到Service Model的简要描述。在这里我简单给翻译如下: 




基于中cxf实现webService,JaxWsProxyFactoryBean和JaxWsServerFactoryBean代表什么意思和作用?

前者创建客户端的代理,生成factory对象,用于调用服务端的方法
后者创建服务端的对象 用于发布服务


Serivce Model负责描述了在CXF所提供的一个服务信息。它由两部分内容组成。一是和WSDL相类似的服务信心,例如 operations, bindings,还有endpoints。 另一部分就是服务自身的信息,这些信息是和CXF runtime相关的,包括ServiceInfo, data-binding 信息,service interceptors,以及服务的一些属性等。
CXF的一个服务信息(service)可以通过Refelection从Java Classes获得,也可以通过WSDL1.1 或者 WSDL2.0获得。一般情况下CXF通过特定的Frontend模块中的ServiceFactory来创建服务信息。ServiceFactory 在创建服务信息的同时也负责进行interceptors,databindings等的配置。

Service Modle中包含了很多Info Class,各模块之间关系如下

ServiceInfo
+-Interface: InterfaceInfo
| +-operations: Collection
| | +- Input: MessageInfo
| | +- Output: MessageInfo
| | +- Faults: Collection
+-Bindings: Collection
| +-Operations: Collection
+-Endpoints: Collection


CXF使用了Woden用以从WSDL构建Service Model,大家可以发现Service Model 与 Woden API中对WSDL元素的描述是很类似的。有关Service Model的详细信息大家可以从CXF API中的Java doc以及源代码一窥究竟。

下面我给大家简单介绍几个Service Model在CXF API设计中的应用,希望能对大家使用CXF API有所帮助。

ServerFactoryBean


在CXF中有几个很相似名词 JaxWsServiceFactoryBean, JaxWsServerFactoryBean,当初我刚接触的时候也困惑了一阵,好在当时正好Dan Diephouse在北京,我就当面问了他一下这个问题,也算是得到一个权威解释了。其实如果大家仔细看过我的上一篇文章和这篇文章,应该对所谓的Server以及Service 的 FactoryBean有一个大概的认识了。

Server 是对服务器端来说,Service是针对服务信息来说的。也就是一个Server必然要包含一个Servie信息。
如果我们使用CXF内部API来创建服务的话,我们只需要通过设置JaxWsServerFactoryBean 就可以发布服务了。如果大家浏览一下具体的代码可以发现 在JaxWsServerFactorBean的构造函数中会创建一个缺省JaxWsServiceFactoryBean. 当然你在构建自己的Server的同时也可以设置自己的ServiceFactoryBean,我的理解是提供这样API目的在于CXF对Spring的支持。你可以在Spring中定义装配符合自己要求的服务,自然需要有读取和设置的这或者那样Bean的方法了。


AbstractServiceFactoryBean


作为ServiceFactoryBean的抽象类这里定义了我们前面提到的服务信息中包含了服务自身的内容,也就是CXF runtime需要的配置信息。主要包含了dataBinding, Interceptors等的信息。

ReflectionServiceFactoryBean


它是simple frontend的ServiceFactoryBean,至于为什么叫做ReflectionServiceFactoryBean要从Simple Frontend支持POJO的服务实现说起。简单来说我们可以通过Reflection API获取到POJO Class的方法,参数以及返回值信息。ReflectionServiceFactoryBean就是在这些信息的基础上,构建Service Model的。当然RefectionServiceFactoryBean 也支持从WSDL创建Service Model。大家在调用ServiceFactoryBean构建Service Modle的时候需要注意一条很重要的INFO日志 "Create service from WSDL: ..." 或者是 "Create sevice from class ..."。 这条日志来表明Service Model是通过WSDL创建还是通过Class信息创建的。

JaxWsServiceFactoryBean


SUN针对Java的Web Service实现先后提出两套API,一个是JaxRPC,另一个JaxWs。 JaxWsServiceFactoryBean继承了ReflectionServiceFactoryBean, 并提供JaxWsAPI的支持。在该类中这里主要是支持JSR181,重载了很多父类的方法,有关createServiceFromWSDL的部分则可重用父类ReflectionServiceFactoryBean.

基于中cxf实现webService,JaxWsProxyFactoryBean和JaxWsServerFactoryBean代表什么意思和作用?

collections-3.2.2.jar:/app/IBM/WebSphere/AppServer/profiles/AppSrv01/installedApps/ordosjfappCell01/appgate_war.ear/appgate.war Parent: com.ibm.ws.classloader.CompoundClassLoader@1f4260c1[PF][app:appgate_war] Delegation Mode: PARENT_FIRST). [25-5-29 17:05:38:671 CST] 000000bc SystemErr R at org.apache.cxf.common.xmlschema.SchemaCollection.read(SchemaCollection.java:133) [25-5-29 17:05:38:671 CST] 000000bc SystemErr R at org.apache.cxf.databinding.AbstractDataBinding.addSchemaDocument(AbstractDataBinding.java:192) [25-5-29 17:05:38:672 CST] 000000bc SystemErr R at org.apache.cxf.databinding.AbstractDataBinding.addSchemaDocument(AbstractDataBinding.java:95) [25-5-29 17:05:38:672 CST] 000000bc SystemErr R at org.apache.cxf.jaxb.JAXBDataBinding.initialize(JAXBDataBinding.java:349) [25-5-29 17:05:38:672 CST] 000000bc SystemErr R at org.apache.cxf.service.factory.AbstractServiceFactoryBean.initializeDataBindings(AbstractServiceFactoryBean.java:86) [25-5-29 17:05:38:672 CST] 000000bc SystemErr R at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.buildServiceFromClass(ReflectionServiceFactoryBean.java:444) [25-5-29 17:05:38:672 CST] 000000bc SystemErr R at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.buildServiceFromClass(JaxWsServiceFactoryBean.java:690) [25-5-29 17:05:38:672 CST] 000000bc SystemErr R at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:507) [25-5-29 17:05:38:672 CST] 000000bc SystemErr R at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:241) [25-5-29 17:05:38:672 CST] 000000bc SystemErr R at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.create(JaxWsServiceFactoryBean.java:205) [25-5-29 17:05:38:672 CST] 000000bc SystemErr R at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:101) [25-5-29 17:05:38:672 CST] 000000bc SystemErr R at org.apache.cxf.frontend.ClientFactoryBean.create(ClientFactoryBean.java:90) [25-5-29 17:05:38:672 CST] 000000bc SystemErr R at org.apache.cxf.frontend.ClientProxyFactoryBean.create(ClientProxyFactoryBean.java:153) [25-5-29 17:05:38:672 CST] 000000bc SystemErr R at org.apache.cxf.jaxws.JaxWsProxyFactoryBean.create(JaxWsProxyFactoryBean.java:151) [25-5-29 17:05:38:672 CST] 000000bc SystemErr R at com.uxunchina.appgate.socket.client.WebServiceClient_UXUNJFYSmgService.createIjfyFrontService(WebServiceClient_UXUNJFYSmgService.java:37) [25-5-29 17:05:38:672 CST] 000000bc SystemErr R at com.uxunchina.appgate.socket.client.WebServiceClientUtils.qurshortmsg(WebServiceClientUtils.java:315) [25-5-29 17:05:38:672 CST] 000000bc SystemErr R at com.uxunchina.appgate.utils.UxunScanMsg$UxunXFSmg.run(UxunScanMsg.java:53) [25-5-29 17:05:38:672 CST] 000000bc SystemErr R at java.util.TimerThread.mainLoop(Timer.java:566) [25-5-29 17:05:38:672 CST] 000000bc SystemErr R at java.util.TimerThread.run(Timer.java:516) [25-5-30 15:05:34:755 CST] 000000ba SystemErr R java.net.SocketException: Socket closed [25-5-30 15:05:34:755 CST] 000000ba SystemErr R at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:450) [25-5-30 15:05:34:755 CST] 000000ba SystemErr R at java.net.ServerSocket.implAccept(ServerSocket.java:623) [25-5-30 15:05:34:755 CST] 000000ba SystemErr R at java.net.ServerSocket.accept(ServerSocket.java:582) [25-5-30 15:05:34:755 CST] 000000ba SystemErr R at com.uxunchina.appgate.socket.UxunSocketServerInit.run(UxunSocketServerInit.java:41) [25-5-30 15:05:34:755 CST] 000000ba SystemErr R at java.lang.Thread.run(Thread.java:785) [25-5-30 15:07:58:551 CST] 000000b8 SystemErr R java.net.BindException: Address already in use [25-5-30 15:07:58:551 CST] 000000b8 SystemErr R at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:417) [25-5-30 15:07:58:551 CST] 000000b8 SystemErr R at java.net.ServerSocket.bind(ServerSocket.java:444) [25-5-30 15:07:58:551 CST] 000000b8 SystemErr R at java.net.ServerSocket.<init>(ServerSocket.java:258) [25-5-30 15:07:58:551 CST] 000000b8 SystemErr R at java.net.ServerSocket.<init>(ServerSocket.java:149) [25-5-30 15:07:58:551 CST] 000000b8 SystemErr R at com.uxunchina.appgate.socket.ESB2JFYSocketServerInit.run(ESB2JFYSocketServerInit.java:35) [25-5-30 15:07:58:551 CST] 000000b8 SystemErr R at java.lang.Thread.run(Thread.java:785) [25-5-30 15:08:04:822 CST] 0000006d SystemErr R log4j:WARN No such property [maxBackupIndex] in org.apache.log4j.DailyRollingFileAppender. [25-5-30 15:08:05:173 CST] 0000006d SystemErr R log4j:WARN No such property [maxBackupIndex] in org.apache.log4j.DailyRollingFileAppender. [25-5-30 15:08:11:060 CST] 0000006b SystemErr R log4j:WARN No such property [maxBackupIndex] in org.apache.log4j.DailyRollingFileAppender. [25-5-30 15:08:11:061 CST] 0000006b SystemErr R log4j:WARN No such property [maxBackupIndex] in org.apache.log4j.DailyRollingFileAppender. [25-5-30 15:09:00:860 CST] 000000b9 SystemErr R Exception in thread "Timer-8" java.lang.NoSuchMethodError: org/apache/ws/commons/schema/XmlSchemaCollection.read(Lorg/w3c/dom/Document;Ljava/lang/String;)Lorg/apache/ws/commons/schema/XmlSchema; (loaded from file:/app/IBM/WebSphere/AppServer/plugins/org.apache.axis2.jar by org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader@853b4477[org.apache.axis2:7.0.0(id=298)]) called from class org.apache.cxf.common.xmlschema.SchemaCollection (loaded from file:/app/IBM/WebSphere/AppServer/profiles/AppSrv01/installedApps/ordosjfappCell01/appgate_war.ear/appgate.war/WEB-INF/lib/cxf-common-utilities-2.4.10.jar by com.ibm.ws.classloader.CompoundClassLoader@ef9e9231[war:appgate_war/appgate.war] Local ClassPath: /app/IBM/WebSphere/AppServer/profiles/AppSrv01/installedApps/ordosjfappCell01/appgate_war.ear/appgate.war/WEB-INF/classes:/app/IBM/WebSphere/AppServer/profiles/AppSrv01/installedApps/ordosjfappCell01/appgate_war.ear/appgate.war/WEB-
最新发布
07-16
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值