Thanks for this report. I just added an extra check to make sure its a DelegatingInputStream in this case and if not, don't bother trying to pull it in. That should work for your case.
Dan On Tuesday 16 March 2010 8:26:52 pm Pieper, Aaron wrote: > I encountered a tricky problem when upgrading to CXF 2.2.6. I fixed the > issue, but I'm submitting a brief summary of my solution, for the > benefit of other developers who encounter a similar problem in the > future. > > > > When upgrading from CXF 2.2.3 to CXF 2.2.6, I started getting the > following ClassCastException in AttachmentDeserializer: > > > > java.lang.ClassCastException: > org.apache.cxf.helpers.LoadingByteArrayOutputStream$1 cannot be cast to > org.apache.cxf.attachment.DelegatingInputStream > > at > org.apache.cxf.attachment.AttachmentDeserializer.cacheStreamedAttachment > s(AttachmentDeserializer.java:232) > > at > org.apache.cxf.attachment.AttachmentDeserializer.readNext(AttachmentDese > rializer.java:193) > > at > org.apache.cxf.attachment.LazyAttachmentCollection$1.hasNext(LazyAttachm > entCollection.java:94) > > at > org.apache.cxf.transport.http.AbstractHTTPDestination.cacheInput(Abstrac > tHTTPDestination.java:485) > > at > org.apache.cxf.transport.http.AbstractHTTPDestination.flushHeaders(Abstr > actHTTPDestination.java:506) > > at > org.apache.cxf.transport.http.AbstractHTTPDestination$WrappedOutputStrea > m.onFirstWrite(AbstractHTTPDestination.java:611) > > at > org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutpu > tStream.java:42) > > at > org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutpu > tStream.java:55) > > at > org.apache.cxf.attachment.AttachmentSerializer.writeProlog(AttachmentSer > ializer.java:143) > > at > org.apache.cxf.interceptor.AttachmentOutInterceptor.handleMessage(Attach > mentOutInterceptor.java:65) > > at > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorC > hain.java:243) > > > > This was caused because of one of my custom interceptors was trying to > modify the attachments on an outgoing message. It did so by doing > something like this: > > > > Collection<Attachment> attachments = message.getAttachments(); > > DataSource dataSource = new MyDataSource(myInputStream)); > attachments.add(new AttachmentImpl(attachmentId, new > DataHandler(dataSource)); > > > > The custom datasource caused problems for CXF's AttachmentSerializer > class, which assumed in CXF 2.2.6 that all attachments would only use > AttachmentDataSources. My custom attachment with its own kind of > datasource broke this assumption. I was able to work around it by using > this line instead: > > > > DataSource dataSource = new AttachmentDataSource(myInputStream)); > > > > - Aaron -- Daniel Kulp [email protected] http://dankulp.com/blog
