xifre 截取 soap 时在webshpere上出现的问题

用百度搜索关键字“xfire 截取 soap”,就能看到好多千篇一律的方式来实现这个功能(我发现同一个技术问题在百度上搜索出很多一模一样的帖子,真心感觉这不是一个好的现象,最起码转载也应该注明出处啊),当然我也选择了这个功能,大致实现原理可以查看这个帖子:http://blog.sina.com.cn/s/blog_58844e710100gpr7.html

本文重点不是上面的方法,重点是,当以这种方式部署到linux 系统 websphere7.0上,请求某个服务,如何soap消息中出现类似这样的节点“<description>的发掘的[email protected]#$%^&amp;^&amp;**%$##</description>”
,重点是这个节点的值,更重点是这个节点的值里有“^&amb”,那么你取出来的时候会发现内容是错误的是重复的字符串。

我被这个问题困扰了整整一个星期,都被同事鄙视了。

这个问题在tomcat上没有出现过,所以一开始就考虑websphere 和本地环境有什么不一样,但到底是哪里不一样呢?什么地方出现的呢?折腾了一个星期,还是无解。于是就去另外一个系统中测试是否也出现这个问题,他们的系统的环境和我的一模一样,系统的框架也一样。不怀好意的希望他们也有这个问题,结果我擦,他们没这个问题。不过这是个好事,至少让我能够通过比较两个系统不一样的地方来找到问题所在,也许你猜出出来,对!就是这个截取soap的方法我们两个系统不一样,明显我的方式导致了这个问题的出现。

于是下载xfire的源码,一步一步的调试,终于让我发现这个这个问题所在。以下是org.codehaus.util.dom.DOMInHandler 中 invoke 方法中的部分代码:

        doc = STAXUtils.read(dbf.newDocumentBuilder(), context.getInMessage().getXMLStreamReader(), false);

        context.getInMessage().setProperty(DOM_MESSAGE, doc);
        context.getInMessage().setXMLStreamReader(new W3CDOMStreamReader(doc.getDocumentElement()));

问题出在把doc当输入流的源获取的W3CDOMStreamReader又赋值给了XMLStreamReader,在转化的过程中用到的某个java类在websphere上可能被ibm个修改了导致这个功能和本地的运行结果不一样,暂且不说IBM为了让websphere更好的运行丧心病狂的修改了java的类库导致了多少问题出现。但眼前的问题你是不可能去用本机的jre类库去替换IBM的类库的,否则websphere肯定以报一大堆异常来抗议并死活启动不起来。唯一的办法就是另辟蹊径。

通过xfire的源码了解到最开始时这个XMLStreamReader的获得方式,依然的决定再次用这个方式获取XMLStreamReader来代替这个让我着了5个日日夜夜的方式。于是新增了一个类CDOMInHandler 继承 xfire的DOMInHandler 并修改其中的转发方式,以上的代码修改后如下:

             doc = STAXUtils.read(dbf.newDocumentBuilder(), context.getInMessage().getXMLStreamReader(), false);
	    context.getInMessage().setProperty(DOM_MESSAGE, doc);

	    DOMReader xmlReader = new DOMReader();
		org.dom4j.Document dom4jDoc = xmlReader.read(doc);
		StringBuffer soapStr = new StringBuffer(dom4jDoc.asXML());
		InputStream in = new ByteArrayInputStream(soapStr.toString().getBytes(context.getInMessage().getEncoding()));

		XMLStreamReader reader =
             STAXUtils.createXMLStreamReader(in, context.getInMessage().getEncoding(),context);
             
             context.getInMessage().setXMLStreamReader(reader);
	    //context.getInMessage().setXMLStreamReader(new W3CDOMStreamReader(doc.getDocumentElement()));
		

最后解决,内心兴奋之情使我彻夜难眠,于是看了场荷兰和阿根廷的比赛,结果......结果......荷兰输了,呜呜,别拦我,让我睡会觉去,困的都哭不出来了。

xifre 截取 soap 时在webshpere上出现的问题

时间: 2024-08-08 22:08:31

xifre 截取 soap 时在webshpere上出现的问题的相关文章

访问asp网站时,页面上显示请求的资源在使用中

服务器生产环境: 操作系统:WIN2003 WEB:IIS 6.0 问题过程: 9月7日上午8:40左右,科研处长发现他们的网站无法登录,网上留言了我,当我进一步了解情况时,发现还有几个二级网站出现如下情况: 浏览器访问asp网站时,页面上显示请求的资源在使用中:有的ASP网站又可以正常访问,这就带来了一些困难,不知所措,到底发生了什么原因?如果在网上搜集一下,说一大堆原因,实际上一一测试,但无法解决. 此时此刻,心理非常紧张,又在抓紧时间进一步分析,如何解决此次网站运行故障. 通过以下设置,可

html中如何使得改变背景的透明度时,背景上的文字透明度不被改变

1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 2 "http://www.w3.org/TR/html4/loose.dtd"> 3 <html> 4 <head> 5 <title></title> 6 <style type="text/css"> 7 .div1{ 8 width: 15

在Xshell 6开NumLock时按小键盘上的数字键并不能输入数字

小键盘问题 在Xshell 6上用vi的时候,开NumLock时按小键盘上的数字键并不能输入数字,而是出现一个字母然后换行(实际上是命令模式上对应上下左右的键).解决方法 选项Terminal->Features里,找到Disable application keypad mode,选上就可以了 在xmanager 4 中的xshell也有小键盘问题 解决方法为 修改session 属性 -> 终端->VT模式->初始数字键盘模式 选择 设置为普通. 原文地址:https://ww

java 附件上传时后台验证上传文件的合法性

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 8

php截取字符串时保持英文单词完整性的函数

/** * 该函数截取英文字符串,不会打断英文单词,就是说不会把一个单词截取一半 * note: 不适用于中文,当然改改也可以 * note: 目前该函数有点小bug,$cutlength 不是指长度,而是计算所有单词的长度到了这个数时停止,其实也就是空格的长度被忽略了 */ function wordcut($string, $cutlength = 250, $replace = '…'){ //长度不足直接返回 if(mb_strlen($string) <= $cutlength){ r

h5 网络断网时,返回上一个页面 demo (与检测网络代码相结合,更直观看到结果)

页面一: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>网络在线与离线</title> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maxi

Dubbo服务主机IP没有绑定的坑(dubbo注册时出现主机上没有的IP的解决方案)

初次使用dubbo,在研发环境和测试环境测试没有问题,然后将服务上线,上线后,Dubbo服务端启动正常,客户端启动失败,并提示 Caused by: java.lang.IllegalStateException: Failed to check the status of the service com.xxx.xxx.service.LoginService. No provider available for the service com.xxxx.xxxx.service.LoginS

Adobe reader 在打开时如何恢复上一次阅读位置

有一些曾经我问,Adobe reader在打开一个文档时如何才能恢复上一次的阅读位置.这个问题虽小,但是,如果不解决,每次在阅读pdf文档时会带来较大不便.试想,你每次打开一个几千页的教程,都需要从第一页翻到你上一次的阅读位置,是一种什么情景.废话少说,且看设置. 打开文档,步骤如图,不再赘述.

安装ORACLE时在Linux上设置内核参数的含义

转自:http://www.blogjava.net/tbwshc/archive/2012/09/13/387652.htmlhttp://blog.csdn.net/wuweilong/article/details/7420310 安装Oracle之前,除了检查操作系统的硬件和软件是否满足安装需要之外,一个重点就是修改内核参数,其中最主要的是和内存相关的参数设置. SHMMAX参数:Linux进程可以分配的单独共享内存段的最大值.一般设置为内存总大小的一半.这个值的设置应该大于SGA_MA