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

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

        本文重点不是上面的方法,重点是,当以这种方式部署到linux 系统 websphere7.0上,请求某个服务,如何soap消息中出现类似这样的节点“<description>的发掘的edfadfa11232343546345@#$%^&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上出现的问题,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。