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)
然,在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冲突问题,需谨慎测试使用
以上两种方法测试可行