xfire1.2.6在 weblogic下传输二进制数据的时候报异常的解决方案,最近手头上负责一个邮件发送接口项目,需要通过webpower来实现发送邮件,对外提供一个接口。通讯通过webservice来做,文件传输通过byte[]数组。项目进行到最后的测试阶段,突然发现原来在tomcat能够后进行附件发送的程序在weblogic不能用了。具体问题如下:
在weblogic服务器上传输byte类型字段是会报:
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:3498)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(Unknown Source)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2180)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2086)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1406)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)
解决办法:
我通过把webservice接口方法的byte参数改成String参数来解决这个问题。
把接口方法的byte类型改成String类型。再通过byte数组转成String传入webService接口,后台接收把String再转成byte
代码如下:
BASE64Encoder encoder = new BASE64Encoder();
String base64 = encoder.encode(buffer);
//调用接口方法传入参数
MailService service = new MailService();
MailServicePortType mailServicePortType = service.getMailServiceHttpPort();
* @param subject mail主题
* @param content 内容
* @param accept 接收邮件人
* @param files 字符流 (附件不得超过5M)
* @param fileName 附件名称(强烈建议用英文名)
* @param sys 来源系统
* @param priority 优先级别
boolean flg = mailServicePortType.sendEmailToFiles(subject, content, accept, base64, "test.pdf", sys, priority);
//后台接口接收
byte[] bt = null;
try {
bt = new sun.misc.BASE64Decoder().decodeBuffer(files.trim());
} catch (IOException e1) {
e1.printStackTrace();
}