`
doony
  • 浏览: 5682 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论
  • doony: 已经用jsf做了不下5个项目了,用的很happy,现在自己在搞 ...
    JSF起步
  • cairnsfu: 真的吗?我学了一年丝毫没感觉到她的前途。最好的不一定是最流行的 ...
    JSF起步
  • zhangguobin: 整点有用的啊,大哥~·
    JSF起步

xfire客户端连接cxf服务端完全解决!

阅读更多

背景:项目需求要求与一个外部接口做对接,对方的服务端是cxf,而项目组用的是xfire1.2.6,JDK1.5。

      对方也不可能改他们的服务端为xfire版本。

问题:因为历史原因,本项目是运行了多年的老系统,jdk1.5的环境,客户不可能因为一个接口就升级jdk到1.6,而且老系统里有很多接口都是在xfire上开发的,也不可能因为cxf来一次大改动,还不包括测试。

执行:用xfire静态模式来调用cxf服务端,报错,有注解的错,jar兼容的问题,还有一些网上讨论的问题。花了一周时间做了各自修改测试(配置上的),都无法完美解决xfire客户端调用cxf服务端的问题。

其中甚至包括把cxf生成的对应客户端包括环境jar包打成一个jar包来测试(目的是不影响生产环境其他jar,可以不用为升级jar或兼容问题操心了),

但是测试发现,这种打jar包的方法只能在jdk1.6下执行,在jdk1.5下就报找不到rt.jar下的

 java.lang.NoClassDefFoundError: javax/xml/ws/Service

初衷是想不伤筋动骨下完成这个接口的对接。

看来不做点小手术是不行的了,好吧,开始改xfire源码。

cxf就是在xfire基础上升级而来的,cxf解决了xfire的很多缺陷,并且xfire停留在1.2.6版本上就再没更新了。

大趋势是cxf替换掉老掉牙的xfire,但你那注解式的开发貌似引出配置上很多问题,而且本人极度不习惯注解;而且cxf对soap是严格标准,对xfire很难容忍,xfire的一些元素命名格式不符合cxf的标准,导致xfire client to cxf无法成功。

那么开始从soap入手看看到底哪里不对了。

设置cxf服务端接口,支持打印请求和响应:

这个是我测试的接口文件和接口方法

@WebService
@Features(features = "org.apache.cxf.feature.LoggingFeature") 
public interface HelloWord {

 public @WebResult String sayHello(String name,String agr);

}

 

先来看cxf客户端调用的soap请求和服务端的响应:

2013-1-23 13:07:17 org.apache.cxf.interceptor.LoggingInInterceptor logging
信息: Inbound Message
----------------------------
Encoding: UTF-8
Headers: {content-length=[198], connection=[keep-alive], cache-control=[no-cache
], host=[localhost:8083], user-agent=[Java/1.5.0_12], SOAPAction=[""], pragma=[n
o-cache], content-type=[text/xml; charset=UTF-8], Accept=[*]}
Messages:
Message:

Payload: http://schemas.xmlsoap.org/soap/envelope/"><<BR>soap:Body>doony28http://test.com/">doony28
rg1>
--------------------------------------
say hello age=28
2013-1-23 13:07:17 org.apache.cxf.interceptor.LoggingOutInterceptor$LoggingCallb
ack onClose
信息: Outbound Message
---------------------------
Encoding: UTF-8
Headers: {}
Messages:
Payload: http://schemas.xmlsoap.org/soap/envelope/"><<BR>soap:Body>hello">http://test.com/">hello doony age 28
--------------------------------------

再来看xfire的请求:

Payload: http://schemas.xmlsoap.org/soap/envelope/"

xmlns:xsd="

http://www.w3.org/2001/XMLSchema"

xmlns:xsi="

">http://www.w3.org/2001/XMLSchema-instance">

/">http://test.com">

doony

28

 

可以看到xfire对sayHello的参数,包了个“”的标签。

以及的也少了一个“/”,

那么是否能把soap改成和cxf一致就可以了呢。

一番调试,确定了soap生成的java类是“org.codehaus.xfire.service.binding.AbstractBinding”。

修改它,让它支持cxf,再测,

yes,xfire可以了。

 

题外话,调试过程中,发现xfire确实存在不少优化及待改进的问题 ,下来有时间慢慢完善,

不想这么快就杀死xfire,系统还是存在很多外部调用方也是xfire的,我们升级成cxf,那估计他们要痛苦了。

 

这里附上xfire的动态客户端代码,方便测试:

import java.net.HttpURLConnection;

import java.net.URL;

 

import org.codehaus.xfire.client.Client;

import org.codehaus.xfire.transport.http.CommonsHttpMessageSender;

 

public class Test {

public static final String WebService_URL = "http://localhost:8083/WebService/HelloWorld?wsdl";

 

public static void main(String[] args) {

Client client1 = null;

try {

URL _url = new URL(WebService_URL);

HttpURLConnection httpConnection = (HttpURLConnection)_url.openConnection();

httpConnection.setReadTimeout(20000);//设置http连接的读超时,单位是毫秒       

httpConnection.connect();

client1 = new Client(httpConnection.getInputStream(), null);

client1.setProperty(CommonsHttpMessageSender.HTTP_TIMEOUT, String.valueOf( 20000 ));//设置发送的超时限制,单位是毫秒;        

client1.setProperty(CommonsHttpMessageSender.DISABLE_KEEP_ALIVE, "true");        

client1.setProperty(CommonsHttpMessageSender.DISABLE_EXPECT_CONTINUE, "true");

Object[] strResult1 = null;

// 如果接口有方法名,且需要带参数,则在 invoke注明,参数以Object[]数组形式

strResult1 = client1.invoke("sayHello", new Object[] {"doony","28"});

System.out.println("调接口返回xml格式-->" + strResult1[0]);

} catch (Exception e) {

e.printStackTrace();

}

}

}

xfire静态客户端这里就不列了,都能用。
 

在cxf2.1.3,2.5.2,2.7下都已经测试可以,且不影响原有xfire服务。

分享到:
评论

相关推荐

    xfire与cxf解决冲突

    因与cxf包xmlschema-core-*.jar 冲突 故重新打包 XmlSchema-1.1.jar 源码修改原类径的方法来重新打包避免冲突 源码放在javas.rar文件夹中 org.codehaus.xfire.wsdl11.parser.SchemaInfo org.codehaus.xfire....

    Xfire调用webservice无法接收到参数问题解决

    标题"Xfire调用webservice无法接收到参数问题解决"指出的核心问题是:当使用Xfire作为客户端调用Web服务时,服务端无法正确接收到传递的参数。这可能是由于多种原因引起的,如: 1. **XML序列化与反序列化问题**:...

    spring2.5+xfire1.2.6 客户端和服务端的配置

    标题 "spring2.5+xfire1.2.6 客户端和服务端的配置" 涉及的是一个早期的Web服务集成方案,其中Spring 2.5是一个流行的Java应用框架,而Xfire 1.2.6则是一个用于构建和消费Web服务的库。在那个时代,Xfire是Spring...

    cxf_axis_xfire客户端调用的几种方法[收集].pdf

    CXF、AXIS2、XFire是三种流行的Java Web服务框架,它们允许开发者创建和消费Web服务。在本文中,我们将重点关注CXF客户端调用Web服务的方法,特别是处理Map类型参数的问题。 首先,CXF客户端调用Web服务时,通常会...

    CXF 一个完整的webService(整合客户端和服务端)

    CXF不仅简化了Web服务的开发,而且允许开发者无缝地在客户端和服务端之间切换,从而实现双向通信。 **1. CXF入门** 对于初学者,了解CXF的基本概念是至关重要的。CXF基于JAX-WS(Java API for XML Web Services)...

    java利用 xfire实现 webservices 服务端与客户端

    本篇文章将深入探讨如何利用XFire在服务端和客户端之间建立Web服务通信。 一、Web服务基础 Web服务是一种基于标准的,能够跨越不同操作系统、编程语言和网络环境的通信方式。它们通常使用SOAP(Simple Object ...

    cxf服务端wsdl发布帮助.docx

    ### CXF服务端WSDL发布及代码生成详解 #### 一、概述 在现代软件开发中,特别是企业级应用开发领域,Web服务扮演着至关重要的角色。CXF(Camel and XFire)作为Apache下的一个开源项目,为开发高质量的Web服务提供...

    使用Xfire构建JAVA的webService全过程(从服务端到客户端)

    本文将深入探讨如何使用Xfire来创建一个完整的JAVA Web服务,包括服务端和客户端的实现。 首先,Xfire是一个基于Apache CXF的轻量级Web服务框架,它支持SOAP、RESTful以及WS-*规范,提供快速、高效的开发体验。在...

    xfire搭建webservice服务端以及万能客户端所需jar包

    5. **测试和调试**:确保客户端能够正确连接到服务端,调用服务并处理返回数据。 在"xfire webservice"的标签下,我们可以看出这是关于使用XFire实现Web服务的关键点。XFire的强大在于其对多种Web服务标准的支持,...

    xfire服务端

    xfire服务端是Apache CXF项目的一个早期版本,后来CXF合并了xfire的功能并成为更全面的服务栈。xfire提供了一种简洁的方式来创建、部署和消费Web服务,支持SOAP、RESTful等多种服务模式。它使用XML Schema来定义服务...

    CXF服务端和客户端 应用开发指南

    ### CXF服务端和客户端应用开发指南:详细解析与实践 #### 一、CXF概述与应用场景 CXF(Camel XFire Framework)是Apache软件基金会的一个开源项目,旨在简化Web Services的开发过程,提供了一个强大的框架来创建...

    验证客户端源码cxf

    CXF(Camel XFire)是一个开源服务框架,它允许开发人员创建和部署基于Java API for Web Services (JAX-WS) 和Java API for RESTful Web Services (JAX-RS) 的Web服务。CXF是一个高度可扩展且功能丰富的框架,提供了...

    CXF整合spring的客户端和服务端

    综上所述,"CXF整合Spring的客户端和服务端"是一个全面的示例,涵盖了从服务创建到客户端调用的全过程,对于理解和实践SOA和Web服务开发具有很高的价值。同时,提供的文档和配置文件可以帮助开发者快速上手,节省了...

    XFire创建WebService服务端和客户端

    二、XFire客户端创建 1. **生成客户端代理**:XFire提供了一个工具(如`xfire-proxy-gen`)用于从服务端的WSDL(Web Service Definition Language)文件生成客户端代理类。运行这个工具,指定服务的WSDL URL,它会...

    WebService Axis和XFire(CXF)的开发流程

    2. **XFire (CXF)**:XFire(现为Apache CXF)是一个更现代的框架,它集成了Spring,使得服务端的开发更加简单,因为大部分逻辑都被封装到了底层API中。XFire支持直接配置生成WSDL,且能与Spring无缝集成,简化了...

    xfire实现webService服务端与客户端使用说明

    **标题:** Xfire实现Web服务端与客户端使用详解 **一、引言** 在IT行业中,Web服务(Web Service)是一种基于互联网的标准协议,用于不同系统间的交互,它允许应用程序通过HTTP协议交换数据。Xfire是一款开源的Java...

    xfire服务端demo

    《Xfire服务端Demo详解与实战》 Xfire是一款基于Java技术构建的Web服务框架,专为开发高质量、高性能的Web服务而设计。在本文中,我们将深入探讨Xfire服务端Demo,理解其核心概念、功能特性,并通过具体的代码示例...

    XFire Java Web Service 客户端

    《XFire Java Web Service 客户端详解》 ...尽管现在有更多现代的解决方案如Apache CXF、Spring-WS等,但了解XFire的工作原理和使用方法,对于我们理解Web服务的实现机制和历史发展具有重要的学习价值。

    xfire+spring+maven构建webservice服务器和客户端

    标题中的“xfire+spring+maven构建webservice服务器和客户端”揭示了本教程将围绕三个主要技术进行讨论:XFire、Spring和Maven。这三者都是Java开发中不可或缺的工具,尤其在构建Web服务方面。 XFire是早期的一个...

    xfire java webservice(cxf前身框架了解webservice原理很好的入门框架)

    通过本指南,您可以掌握如何使用XFire创建WebService服务端和客户端,包括服务端开发步骤、客户端开发流程以及如何配置安全认证等功能。这些知识对于初学者来说是非常宝贵的,有助于深入理解现代Web服务的工作机制和...

Global site tag (gtag.js) - Google Analytics