当前位置: 代码迷 >> Web前端 >> xfire1.2.6在 weblogic上传输二进制数据的时候报错误的解决方案
  详细解决方案

xfire1.2.6在 weblogic上传输二进制数据的时候报错误的解决方案

热度:552   发布时间:2012-08-22 09:50:35.0
xfire1.2.6在 weblogic下传输二进制数据的时候报异常的解决方案
手头负责了一个j2ee项目是跟CAD二次开发平台做交互的。通讯通过webservice来做,文件传输通过byte[]数组。项目进行到最后的测试阶段,突然发现原来在tomcat跑得好好的程序在weblogic不能用了。
异常信息如下:
严重: Fault occurred!
java.lang.UnsupportedOperationException
        at weblogic.xml.stax.XMLStreamReaderBase.getTextCharacters(XMLStreamReaderBase.java:487)
        at org.codehaus.xfire.util.stax.DepthXMLStreamReader.getTextCharacters(DepthXMLStreamReader.java:179)
        at org.codehaus.xfire.util.stax.DepthXMLStreamReader.getTextCharacters(DepthXMLStreamReader.java:179)
        at org.codehaus.xfire.aegis.type.basic.Base64Type.readObject(Base64Type.java:71)
        at org.codehaus.xfire.aegis.type.basic.ArrayType.readCollection(ArrayType.java:80)
        at org.codehaus.xfire.aegis.type.basic.ArrayType.readObject(ArrayType.java:48)

百度+谷歌之后,发现原来是项目中的webservice框架xfire1.2.6跟weblogic9.2有冲突。
大致的解决方法无非是改变jar包的加载顺序,或者改接口方法将byte[]改成string。
但是项目非常赶,而且cad二次开发平台是外包方做的,同时外包方人不在现场,联调起来非常痛苦,如果再让他们改接口,时间耽误不起啊。
经过了一个晚上的尝试,我发现其实第二种方法在不更改用户的接口情况下,将服务端的接口方法中的byte[]改成string可行。
通过分析xfire生成的wsdl文件后,我发现byte数组在里面描述的类型为xsd:base64Binary,这样的话是不是意味着实际上byte最后还是会转换成base64编码传递给客户端呢?
如果是的,那么如果我自己把接口定义更改为string,但是客户端的接口不做更改,他们还是用byte[]传递给我,我这边接收到的会不会是base64编码。
于是我尝试了一下,发现传递过来的字符串果然是base64编码。然后我再转换成byte数组就ok了。
byte[] result = new sun.misc.BASE64Decoder().decodeBuffer(str.trim());

这样我的程序就正常在weblogic上面运行了。
  相关解决方案