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()));
		

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


      

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值