背景:项目需求要求与一个外部接口做对接,对方的服务端是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();
}
}
}
相关推荐
因与cxf包xmlschema-core-*.jar 冲突 故重新打包 XmlSchema-1.1.jar 源码修改原类径的方法来重新打包避免冲突 源码放在javas.rar文件夹中 org.codehaus.xfire.wsdl11.parser.SchemaInfo org.codehaus.xfire....
标题"Xfire调用webservice无法接收到参数问题解决"指出的核心问题是:当使用Xfire作为客户端调用Web服务时,服务端无法正确接收到传递的参数。这可能是由于多种原因引起的,如: 1. **XML序列化与反序列化问题**:...
标题 "spring2.5+xfire1.2.6 客户端和服务端的配置" 涉及的是一个早期的Web服务集成方案,其中Spring 2.5是一个流行的Java应用框架,而Xfire 1.2.6则是一个用于构建和消费Web服务的库。在那个时代,Xfire是Spring...
CXF、AXIS2、XFire是三种流行的Java Web服务框架,它们允许开发者创建和消费Web服务。在本文中,我们将重点关注CXF客户端调用Web服务的方法,特别是处理Map类型参数的问题。 首先,CXF客户端调用Web服务时,通常会...
CXF不仅简化了Web服务的开发,而且允许开发者无缝地在客户端和服务端之间切换,从而实现双向通信。 **1. CXF入门** 对于初学者,了解CXF的基本概念是至关重要的。CXF基于JAX-WS(Java API for XML Web Services)...
本篇文章将深入探讨如何利用XFire在服务端和客户端之间建立Web服务通信。 一、Web服务基础 Web服务是一种基于标准的,能够跨越不同操作系统、编程语言和网络环境的通信方式。它们通常使用SOAP(Simple Object ...
### CXF服务端WSDL发布及代码生成详解 #### 一、概述 在现代软件开发中,特别是企业级应用开发领域,Web服务扮演着至关重要的角色。CXF(Camel and XFire)作为Apache下的一个开源项目,为开发高质量的Web服务提供...
本文将深入探讨如何使用Xfire来创建一个完整的JAVA Web服务,包括服务端和客户端的实现。 首先,Xfire是一个基于Apache CXF的轻量级Web服务框架,它支持SOAP、RESTful以及WS-*规范,提供快速、高效的开发体验。在...
5. **测试和调试**:确保客户端能够正确连接到服务端,调用服务并处理返回数据。 在"xfire webservice"的标签下,我们可以看出这是关于使用XFire实现Web服务的关键点。XFire的强大在于其对多种Web服务标准的支持,...
xfire服务端是Apache CXF项目的一个早期版本,后来CXF合并了xfire的功能并成为更全面的服务栈。xfire提供了一种简洁的方式来创建、部署和消费Web服务,支持SOAP、RESTful等多种服务模式。它使用XML Schema来定义服务...
### CXF服务端和客户端应用开发指南:详细解析与实践 #### 一、CXF概述与应用场景 CXF(Camel XFire Framework)是Apache软件基金会的一个开源项目,旨在简化Web Services的开发过程,提供了一个强大的框架来创建...
CXF(Camel XFire)是一个开源服务框架,它允许开发人员创建和部署基于Java API for Web Services (JAX-WS) 和Java API for RESTful Web Services (JAX-RS) 的Web服务。CXF是一个高度可扩展且功能丰富的框架,提供了...
综上所述,"CXF整合Spring的客户端和服务端"是一个全面的示例,涵盖了从服务创建到客户端调用的全过程,对于理解和实践SOA和Web服务开发具有很高的价值。同时,提供的文档和配置文件可以帮助开发者快速上手,节省了...
二、XFire客户端创建 1. **生成客户端代理**:XFire提供了一个工具(如`xfire-proxy-gen`)用于从服务端的WSDL(Web Service Definition Language)文件生成客户端代理类。运行这个工具,指定服务的WSDL URL,它会...
2. **XFire (CXF)**:XFire(现为Apache CXF)是一个更现代的框架,它集成了Spring,使得服务端的开发更加简单,因为大部分逻辑都被封装到了底层API中。XFire支持直接配置生成WSDL,且能与Spring无缝集成,简化了...
**标题:** Xfire实现Web服务端与客户端使用详解 **一、引言** 在IT行业中,Web服务(Web Service)是一种基于互联网的标准协议,用于不同系统间的交互,它允许应用程序通过HTTP协议交换数据。Xfire是一款开源的Java...
《Xfire服务端Demo详解与实战》 Xfire是一款基于Java技术构建的Web服务框架,专为开发高质量、高性能的Web服务而设计。在本文中,我们将深入探讨Xfire服务端Demo,理解其核心概念、功能特性,并通过具体的代码示例...
《XFire Java Web Service 客户端详解》 ...尽管现在有更多现代的解决方案如Apache CXF、Spring-WS等,但了解XFire的工作原理和使用方法,对于我们理解Web服务的实现机制和历史发展具有重要的学习价值。
标题中的“xfire+spring+maven构建webservice服务器和客户端”揭示了本教程将围绕三个主要技术进行讨论:XFire、Spring和Maven。这三者都是Java开发中不可或缺的工具,尤其在构建Web服务方面。 XFire是早期的一个...
通过本指南,您可以掌握如何使用XFire创建WebService服务端和客户端,包括服务端开发步骤、客户端开发流程以及如何配置安全认证等功能。这些知识对于初学者来说是非常宝贵的,有助于深入理解现代Web服务的工作机制和...