`
sky_sz
  • 浏览: 17429 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

同一项目下两个webservice冲突的问题

阅读更多
同一项目下两个webservice冲突的问题
首先看下javax.xml.ws.spi.Provider的API:
public static Provider provider()
创建一个新的提供者对象。
用于查找将要使用的提供者子类的算法由以下几个步骤组成:
• 如果存在名为 META-INF/services/javax.xml.ws.spi.Provider 的资源,则它的第一行(如果存在)被用作实现类的 UTF-8 编码名称。
• 如果存在 $java.home/lib/jaxws.properties 文件,可以通过 java.util.Properties.load(InputStream) 方法读取它,并且该文件包含键为 javax.xml.ws.spi.Provider 的条目,则该条目的值被用作实现类的名称。
• 如果定义了名为 javax.xml.ws.spi.Provider 的系统属性,则它的值被用作实现类的名称。
• 最后,使用默认的实现类名称。
从中可以看出,比如一项目下有JBoss webservice和CXF,就会出现冲突,如何让这两个共存呢?比如我的项目是个老项目,里面是JBoss webservice,我不肯能删除它的jar包,但又要用CXF,怎么办?
下面列出我的实践步骤(可能会有更好的方法):
1. 创建一个XXXProvider extends Provider
2. 将CXF的lib/endorsed目录打开,反编译geronimo-jaxws_2.2_spec-1.1.jar(有源码更好),将CXF重写的Provider类内容copy到XXXProvider
3. 注掉public abstract ServiceDelegate createServiceDelegate(URL paramURL, QName paramQName, Class<? extends Service> paramClass);
4. Copy java的FactoryFinder类到XXXProvider下,修改find方法下的serviceId,
String serviceId = "META-INF/services/" + factoryId;,可以改成区别于这个目录的,不改仍会冲突,我的就直接改成String serviceId = factoryId;
5. 打开 cxf-2.5.2.jar copy META-INF/services/目录下的javax.xml.ws.spi.Provider文件放到src下
6. 将通过CXF生成的客户端文件Service 文件,比如我的ContentService.java,修改其构造方法,如下:
public ContentService(URL wsdlLocation, QName serviceName) throws Exception {
    	super(wsdlLocation, serviceName);
//下面是修改的,通过反射
ServiceDelegate delegate = FTVPProvider.provider().createServiceDelegate(wsdlLocation,
            serviceName, this.getClass());
    	
Field field = this.getClass().getSuperclass().getDeclaredField("delegate");
    	field.setAccessible(true);
    	field.set(this, delegate);
     }

7. 项目下需要的jar包:cxf-2.5.2.jar,geronimo-jaxws_2.2_spec-1.1.jar,neethi-3.0.1.jar,wsdl4j-1.6.2.jar,xmlschema-core-2.0.1.jar

贴上这个blog其实就是把自己经历的记录下来,以后碰到的话可做个参考,大家有什么好的方法,可以贴上来,一起学习下,或者我的方法有什么问题,大家也请指教。
0
1
分享到:
评论

相关推荐

    WebService完整教程

    1. 端口冲突:多个WebService部署在同一服务器上时可能出现端口冲突,可以通过配置服务端点地址来解决。 2. 安全性:为了保护服务不被非法访问,可以采用HTTPS、WS-Security等方式增强安全性。 3. 性能优化:对于...

    webservice 入门概念

    - **命名空间**:XML 命名空间用于解决标签冲突问题。通过定义命名空间,可以在同一文档中使用相同的标签而不引起混淆。 - **XSLT (Extensible Stylesheet Language Transformations)**:XSLT 是一种用于转换 XML ...

    基于C#_的Framework程序设计_课后答案

    ### 基于C#的Framework程序设计...- **知识点解析**:选项c中的命名空间声明与其它三个不同,因为它在两个不同的嵌套层级定义了两个不同的类。其他选项中的类要么都在同一命名空间内定义,要么都位于相同的嵌套层级中。

    WinForms疑难解答.doc

    在同一位置放置两个控件可能导致前面的控件遮挡后面的控件。解决方法是调整控件的位置或使用分层布局容器如`Panel`。 **12. window.Forms.Controls中的序号** `Controls`集合包含窗体上的所有控件。可以通过索引来...

    J2EE武功秘籍

    - **ThreadLocal**:提供线程本地变量,每个线程都有自己的副本,避免了多线程环境下的线程安全问题。 **14. override(覆盖), overload(重载) 和 overwrite(重写)** - **Override**:子类覆盖父类的方法。 - **...

    C#多线程详解

    这两种方法都接收一个`Delegate`类型参数,表示要在UI线程上执行的方法。 **3. 消息队列** 每个线程都有自己的消息队列。在WinForm中,UI线程负责处理UI相关的消息,因此它有自己的消息队列。当需要跨线程更新UI时...

    NET软件工程师试题1答案

    11. lock:用于实现线程同步,确保同一时间只有一个线程执行特定代码段。 12. 高,高于标准,标准,低于标准,低:这可能是关于优先级或性能级别的描述。 13. +,Concat:字符串连接可以使用+操作符或Concat方法。 ...

Global site tag (gtag.js) - Google Analytics