求助 cxf采用mtom方式上传的疑惑 Holder<DataHandler> 问题

81 views
Skip to first unread message

stevenmo

unread,
May 20, 2008, 12:42:35 AM5/20/08
to cxf-zh
例子中采用mtom方式有两种 一种是采用Holder<byte[]> 一种是采用 Holder<DataHandler> 方式 第一种
把上传内容转为 byte[] 方式调用没问题 第二种Holder<DataHandler> 方式 客户端调用代码中不加读取
fileHandler的inputStream 流 服务器端webservice会报
javax.xml.stream.XMLStreamException: Trying to output second root,
<soap:Fault> 远程主机强迫关闭了一个现有的连接错误。

没加读取fileHandler流代码:
File filetest= new File("E:/filetest.xml");
Holder<DataHandler> fileHandler= new Holder<DataHandler>();
fileHandler.value = new DataHandler( new FileDataSource(filetest));
client.testUploadfile(fileHandler);

加上读取ileHandler流数据后服务器端webservice正常
InputStream mtomIn = fileHandler.value.getInputStream();
long fileSize = 0;
for (int i = mtomIn.read(); i != -1; i = mtomIn.read()) {
fileSize++;
}

System.out.println("--Received DataHandler back from server, "
+ "returned size is " + fileSize);

服务器端webservice 错误信息如下:
org.apache.cxf.interceptor.Fault: Could not write attachments.
at org.apache.cxf.interceptor.AttachmentOutInterceptor
$AttachmentOutEndingInterceptor.handleMessage(AttachmentOutInterceptor.java:
81)
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:
221)
at
org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:
74)
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:
221)
at
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:
78)
at
org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:
92)
at
org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:
214)
at
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:
151)
at
org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:
170)
at
org.apache.cxf.transport.servlet.AbstractCXFServlet.doPost(AbstractCXFServlet.java:
148)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:
487)
at
org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:
362)
at
org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:
216)
at
org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:
181)
at
org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:
726)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:
405)
at
org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:
114)
at
org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:
152)
at org.mortbay.jetty.Server.handle(Server.java:324)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:
505)
at org.mortbay.jetty.HttpConnection
$RequestHandler.content(HttpConnection.java:842)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:730)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:205)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
at
org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:
395)
at org.mortbay.thread.BoundedThreadPool
$PoolThread.run(BoundedThreadPool.java:450)
Caused by: org.mortbay.jetty.EofException
at org.mortbay.jetty.HttpGenerator.flush(HttpGenerator.java:760)
at org.mortbay.jetty.AbstractGenerator
$Output.blockForOutput(AbstractGenerator.java:548)
at org.mortbay.jetty.AbstractGenerator
$Output.flush(AbstractGenerator.java:569)
at org.mortbay.jetty.HttpConnection$Output.flush(HttpConnection.java:
910)
at org.mortbay.jetty.AbstractGenerator
$Output.write(AbstractGenerator.java:646)
at org.mortbay.jetty.AbstractGenerator
$Output.write(AbstractGenerator.java:577)
at
org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:
45)
at javax.activation.DataHandler.writeTo(DataHandler.java:308)
at
org.apache.cxf.attachment.AttachmentSerializer.writeAttachments(AttachmentSerializer.java:
146)
at org.apache.cxf.interceptor.AttachmentOutInterceptor
$AttachmentOutEndingInterceptor.handleMessage(AttachmentOutInterceptor.java:
79)
... 27 more
Caused by: java.io.IOException: 远程主机强迫关闭了一个现有的连接。
at sun.nio.ch.SocketDispatcher.write0(Native Method)
at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:33)
at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:104)
at sun.nio.ch.IOUtil.write(IOUtil.java:60)
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:334)
at org.mortbay.io.nio.ChannelEndPoint.flush(ChannelEndPoint.java:166)
at
org.mortbay.io.nio.SelectChannelEndPoint.flush(SelectChannelEndPoint.java:
207)
at org.mortbay.jetty.HttpGenerator.flush(HttpGenerator.java:693)
... 36 more
2008-5-20 12:27:18 org.apache.cxf.phase.PhaseInterceptorChain
doIntercept
信息: Interceptor has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: Error writing to XMLStreamWriter.
at
org.apache.cxf.binding.soap.interceptor.Soap11FaultOutInterceptor.handleMessage(Soap11FaultOutInterceptor.java:
140)
at
org.apache.cxf.binding.soap.interceptor.Soap11FaultOutInterceptor.handleMessage(Soap11FaultOutInterceptor.java:
43)
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:
221)
at
org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:
96)
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:
262)
at
org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:
74)
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:
221)
at
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:
78)
at
org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:
92)
at
org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:
214)
at
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:
151)
at
org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:
170)
at
org.apache.cxf.transport.servlet.AbstractCXFServlet.doPost(AbstractCXFServlet.java:
148)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:
487)
at
org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:
362)
at
org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:
216)
at
org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:
181)
at
org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:
726)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:
405)
at
org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:
114)
at
org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:
152)
at org.mortbay.jetty.Server.handle(Server.java:324)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:
505)
at org.mortbay.jetty.HttpConnection
$RequestHandler.content(HttpConnection.java:842)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:730)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:205)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
at
org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:
395)
at org.mortbay.thread.BoundedThreadPool
$PoolThread.run(BoundedThreadPool.java:450)
Caused by: javax.xml.stream.XMLStreamException: Trying to output
second root, <soap:Fault>
at
com.ctc.wstx.sw.BaseStreamWriter.throwOutputError(BaseStreamWriter.java:
1473)
at
com.ctc.wstx.sw.BaseStreamWriter.throwOutputError(BaseStreamWriter.java:
1480)
at
com.ctc.wstx.sw.BaseStreamWriter.reportNwfStructure(BaseStreamWriter.java:
1508)
at
com.ctc.wstx.sw.BaseNsStreamWriter.checkStartElement(BaseNsStreamWriter.java:
444)
at
com.ctc.wstx.sw.SimpleNsStreamWriter.writeStartOrEmpty(SimpleNsStreamWriter.java:
260)
at
com.ctc.wstx.sw.BaseNsStreamWriter.writeStartElement(BaseNsStreamWriter.java:
319)
at
org.apache.cxf.binding.soap.interceptor.Soap11FaultOutInterceptor.handleMessage(Soap11FaultOutInterceptor.java:
71)
... 30 more


另:再请教,泛型集合是否可以采用mtom方式进行数据上传 比如 push<List<model>> model 对应系统中表的普通数
据 没有文件流等数据 只是表的数据太大 需要一次上传太多 因而考虑采用mtom方式进行上传 现在配置方面也根据mtom的方式 服务器 客户
端都配置了 mtom-enabled true model 也添加了 @XmlType
@XmlAccessorType(XmlAccessType.FIELD) 但系统还是报错:
javax.xml.ws.soap.SOAPFaultException: Couldn't find MIME boundary:
------=_Part_0_30528184.1211258401125
2008-05-20 12:40:08,031 INFO
[com.syscanhc.oa.util.CenterInfoDataUploadServiceImpl] - <上传数据出现异常,异常原
因:javax.xml.ws.soap.SOAPFaultException: Couldn't find MIME boundary:
------=_Part_0_30528184.1211258401125>
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:
218)
at $Proxy35.pushOutpatientpaytypes(Unknown Source)
at
com.syscanhc.oa.util.CenterInfoDataUploadServiceImpl.upload(CenterInfoDataUploadServiceImpl.java:
221)
at com.syscanhc.oa.util.CenterInfoDataUploadServiceImpl$
$FastClassByCGLIB$$176b11d4.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)
at org.springframework.aop.framework.Cglib2AopProxy
$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:695)
at
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:
144)
at
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:
107)
at
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:
166)
at org.springframework.aop.framework.Cglib2AopProxy
$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:630)
at com.syscanhc.oa.util.CenterInfoDataUploadServiceImpl$
$EnhancerByCGLIB$$90498dd2.upload(<generated>)
at
com.syscanhc.oa.util.CenterInfoDataUpload.uploadData(CenterInfoDataUpload.java:
115)
at
com.syscanhc.oa.util.CenterInfoDataUpload.reScheduleJob(CenterInfoDataUpload.java:
133)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:
283)
at
org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean
$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:
272)
at
org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:
86)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool
$WorkerThread.run(SimpleThreadPool.java:529)
Caused by: org.apache.cxf.binding.soap.SoapFault: Couldn't find MIME
boundary: ------=_Part_0_30528184.1211258401125
at
org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:
70)
at
org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:
35)
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:
221)
at
org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:
96)
at
org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:
65)
at
org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:
34)
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:
221)
at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:429)
at org.apache.cxf.transport.http.HTTPConduit
$WrappedOutputStream.handleResponse(HTTPConduit.java:1988)
at org.apache.cxf.transport.http.HTTPConduit
$WrappedOutputStream.close(HTTPConduit.java:1824)
at java.util.zip.DeflaterOutputStream.close(DeflaterOutputStream.java:
149)
at
com.syscanhc.webservice.cxf.StreamInterceptor.StreamInterceptor.handleMessage(StreamInterceptor.java:
88)
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:
221)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:276)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:222)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:
73)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:
177)
... 21 more

stevenmo

unread,
May 20, 2008, 1:10:20 AM5/20/08
to cxf-zh
泛型集合采用mtom方式上传后已经改成 push(Holder<List<model> > list)

stevenmo

unread,
May 20, 2008, 1:05:51 AM5/20/08
to cxf-zh
泛型集合上传方式已经改成mtom上传 push(<Holder<List<model> > list)

stevenmo

unread,
May 21, 2008, 3:54:15 AM5/21/08
to cxf-zh
泛型集合上传现在采用了比较笨的办法 把集合转为 byte[] 数组上传 总算先应付了 有好的建议再改进吧 :)
Reply all
Reply to author
Forward
0 new messages