用百度搜索关键字“xfire 截取 soap”,就能看到好多千篇一律的方式来实现这个功能(我发现同一个技术问题在百度上搜索出很多一模一样的帖子,真心感觉这不是一个好的现象,最起码转载也应该注明出处啊),当然我也选择了这个功能,大致实现原理可以查看这个帖子:http://blog.sina.com.cn/s/blog_58844e710100gpr7.html。
本文重点不是上面的方法,重点是,当以这种方式部署到linux 系统 websphere7.0上,请求某个服务,如何soap消息中出现类似这样的节点“<description>的发掘的edfadfa11232343546345@#$%^&^&**%$##</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()));
最后解决,内心兴奋之情使我彻夜难眠,于是看了场荷兰和阿根廷的比赛,结果......结果......荷兰输了,呜呜,别拦我,让我睡会觉去,困的都哭不出来了。