weblogic 与 xfire 无法正确解析byte[]

最近遇到一个weblogic和xfire冲突问题,

运行环境为AIX或linux,webLogic版本:10.3.2.0,xfire:1.2.6,jdk:1.6.0-24

状况为,部署的项目中上传文件(不论大小)都会转成byte[],然后传送到后台处理,此时报错为

E

ERROR][2016-10-25 20:19:30.008]Fault occurred!
java.lang.UnsupportedOperationException
at weblogic.xml.stax.XMLStreamReaderBase.getTextCharacters(XMLStreamReaderBase.java:515)
at org.codehaus.xfire.util.stax.DepthXMLStreamReader.getTextCharacters(DepthXMLStreamReader.java:180)
at org.codehaus.xfire.util.stax.DepthXMLStreamReader.getTextCharacters(DepthXMLStreamReader.java:180)
at org.codehaus.xfire.aegis.type.basic.Base64Type.readObject(Base64Type.java:74)
at org.codehaus.xfire.aegis.AegisBindingProvider.readParameter(AegisBindingProvider.java:169)
at org.codehaus.xfire.service.binding.AbstractBinding.read(AbstractBinding.java:206)
at org.codehaus.xfire.service.binding.WrappedBinding.readMessage(WrappedBinding.java:51)
at org.codehaus.xfire.soap.handler.SoapBodyHandler.invoke(SoapBodyHandler.java:42)
at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
at org.codehaus.xfire.transport.DefaultEndpoint.onReceive(DefaultEndpoint.java:64)
at org.codehaus.xfire.transport.AbstractChannel.receive(AbstractChannel.java:38)
at org.codehaus.xfire.transport.http.XFireServletController.invoke(XFireServletController.java:304)
at org.codehaus.xfire.transport.http.XFireServletController.doService(XFireServletController.java:129)
at org.codehaus.xfire.transport.http.XFireServlet.doPost(XFireServlet.java:116)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:175)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3594)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2202)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2108)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1432)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)
View Code

 

然,在webLogic10.3.6.0下(jdk1.7)测试不会出现此异常,在tomcat和websphere下也会不出现

直观的查看堆栈信息可知将byte[]信息转为base64字符串可行,这也是网上查阅时大多数提供的解决办法

先将测试可行方法列举如下

1.上传的文件由byte[]转为base64,webservice接口中以String代替byte[],

劣势为:如果是产品,代码无法改动,即便可以改动也或因改动面过大,因此有修改遗漏的可能性

2.在webLogic.xml文件中增加如下信息:

<weblogic-web-app>
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>
</weblogic-web-app>

标红部分为主要添加内容,即:优先加载web-inf下的信息,避免jar包冲突:

劣势为:优先加载web-inf下信息,在使用较多外部jar时,可能存在其他jar冲突问题,需谨慎测试使用

 

以上两种方法测试可行

 

posted on 2016-10-27 16:24  jzzlo  阅读(370)  评论(0编辑  收藏  举报