Jep, that sounds good and seems to be exactly what I need.

Many Thanks!

Greetings,
Stephan

On 12/11/12 6:32 PM, "Sergey Beryozkin" <[email protected]> wrote:

>Hi Stephan
>
>On 11/12/12 16:47, Klevenz, Stephan wrote:
>> Hi Sergey,
>>
>> Thanks for already fast reply.
>>
>> I have attached a thread dump and the involved class was
>> AttachmentInInterceptor.
>>
>> I assume the MultipartBody will work and I could also access the stream
>> via injected MessageContext. The problem is that both, MultipartBody and
>> MessageContext, are CXF dependencies. Our code, at least for this part,
>> should depend on JAX-RS API only.
>>
>> So is there an option to tell CXF not to handle multipart/mixed
>>messages?
>
>Sure, can you please extend CXF MultipartProvider and override its
>readFrom and return false if it is InputStream.class ?
>Or probably better yet, register a custom JAX-RS MessageBodyReader which
>will have @Consumes("multipart/mixed"), and typed on InputStream, and
>return the input stream immediately in its readFrom.
>
>I guess with CXF 2.7.1 you can also use JAX-RS 2.0 ReaderInterceptor to
>get the same done
>
>HTH
>
>Cheers, Sergey
>
>>
>> Regards,
>> Stephan
>>
>>
>> org.apache.cxf.jaxrs.provider.MultipartProvider readFrom()
>>
>> org.apache.cxf.interceptor. AttachmentInInterceptor handleMessage()
>>
>>
>>
>> Thread [qtp14633156-18 - /odata.svc/$batch] (Suspended (breakpoint at
>>line
>> 60 in AttachmentInInterceptor))
>>          owns: PhaseInterceptorChain  (id=65)
>>
>> 
>>AttachmentInputInterceptor(AttachmentInInterceptor).handleMessage(Message
>>)
>> line: 60
>>          MessageContextImpl.createAttachments(String) line: 235
>>          MessageContextImpl.get(Object) line: 73
>>          ThreadLocalMessageContext.get(Object) line: 38
>>          AttachmentUtils.getMultipartBody(MessageContext, String,
>>String,
>> String) line: 89
>>          AttachmentUtils.getAttachments(MessageContext, String, String,
>> String) line: 94
>>          MultipartProvider.readFrom(Class<Object>, Type, Annotation[],
>> MediaType, MultivaluedMap<String,String>, InputStream) line: 136
>>          JAXRSUtils.readFromMessageBody(Class<T>, Type, Annotation[],
>> InputStream, MediaType, List<MediaType>, Message) line: 1038
>>          JAXRSUtils.processParameter(Class<?>, Type, Annotation[],
>> Parameter, MultivaluedMap<String,String>, Message,
>>OperationResourceInfo)
>> line: 614
>>          JAXRSUtils.processParameters(OperationResourceInfo,
>> MultivaluedMap<String,String>, Message) line: 578
>>          JAXRSInInterceptor.processRequest(Message) line: 238
>>          JAXRSInInterceptor.handleMessage(Message) line: 89
>>          PhaseInterceptorChain.doIntercept(Message) line: 262
>>          ChainInitiationObserver.onMessage(Message) line: 122
>>          
>>ServletDestination(AbstractHTTPDestination).invoke(ServletConfig,
>> ServletContext, HttpServletRequest, HttpServletResponse) line: 211
>>          ServletController.invokeDestination(HttpServletRequest,
>> HttpServletResponse, AbstractHTTPDestination) line: 213
>>          ServletController.invoke(HttpServletRequest,
>>HttpServletResponse)
>> line: 154
>>
>> CXFNonSpringJaxrsServlet(CXFNonSpringServlet).invoke(HttpServletRequest,
>> HttpServletResponse) line: 129
>>
>> 
>>CXFNonSpringJaxrsServlet(AbstractHTTPServlet).handleRequest(HttpServletRe
>>qu
>> est, HttpServletResponse) line: 187
>>
>> CXFNonSpringJaxrsServlet(AbstractHTTPServlet).doPost(HttpServletRequest,
>> HttpServletResponse) line: 110
>>          
>>CXFNonSpringJaxrsServlet(HttpServlet).service(HttpServletRequest,
>> HttpServletResponse) line: 727
>>
>> CXFNonSpringJaxrsServlet(AbstractHTTPServlet).service(ServletRequest,
>> ServletResponse) line: 166
>>          ServletHolder.handle(Request, ServletRequest, ServletResponse)
>> line: 547
>>          ServletHandler.doHandle(String, Request, HttpServletRequest,
>> HttpServletResponse) line: 480
>>          SessionHandler.doHandle(String, Request, HttpServletRequest,
>> HttpServletResponse) line: 225
>>          ServletContextHandler(ContextHandler).doHandle(String, Request,
>> HttpServletRequest, HttpServletResponse) line: 940
>>          ServletHandler.doScope(String, Request, HttpServletRequest,
>> HttpServletResponse) line: 409
>>          SessionHandler.doScope(String, Request, HttpServletRequest,
>> HttpServletResponse) line: 186
>>          ServletContextHandler(ContextHandler).doScope(String, Request,
>> HttpServletRequest, HttpServletResponse) line: 874
>>          ServletContextHandler(ScopedHandler).handle(String, Request,
>> HttpServletRequest, HttpServletResponse) line: 117
>>          HandlerCollection.handle(String, Request, HttpServletRequest,
>> HttpServletResponse) line: 149
>>          Server(HandlerWrapper).handle(String, Request,
>>HttpServletRequest,
>> HttpServletResponse) line: 110
>>          Server.handle(HttpConnection) line: 345
>>
>> 
>>SelectChannelConnector$SelectChannelHttpConnection(HttpConnection).handle
>>Re
>> quest() line: 441
>>          HttpConnection$RequestHandler.content(Buffer) line: 936
>>          HttpParser.parseNext() line: 801
>>          HttpParser.parseAvailable() line: 224
>>
>> 
>>SelectChannelConnector$SelectChannelHttpConnection(AsyncHttpConnection).h
>>an
>> dle() line: 52
>>          SelectChannelEndPoint.handle() line: 586
>>          SelectChannelEndPoint$1.run() line: 44
>>          QueuedThreadPool.runJob(Runnable) line: 598
>>          QueuedThreadPool$3.run() line: 533
>>          Thread.run() line: not available
>>
>>
>>
>>
>> On 12/11/12 2:46 PM, "Sergey Beryozkin"<[email protected]>  wrote:
>>
>>> Stephan, by the way, I'm not seeing
>>>
>>> 'MailAttachmentInterceptor' in CXF source...
>>>
>>> Cheers, Sergey
>>>
>>> On 11/12/12 13:44, Sergey Beryozkin wrote:
>>>> Hi Stephan
>>>>
>>>> On 11/12/12 13:17, Klevenz, Stephan wrote:
>>>>> Dear CXF Gurus and Community!
>>>>>
>>>>> I want to consume a multipart/mixed payload via a stream like shown
>>>>>in
>>>>> the example code below. Unfortunately it seems that injected stream
>>>>>is
>>>>> already closed and can not be used anymore. Debugging CXF shows that
>>>>>a
>>>>> MailAttachmentInterceptor has taken the stream before it is injected.
>>>>> Is there an option to avoid that behavior?
>>>>>
>>>>> Thanks in advance.
>>>>>
>>>>> Greetings,
>>>>> Stephan
>>>>>
>>>>>
>>>>> @POST
>>>>> @Consumes("multipart/mixed")
>>>>> @Produces("multipart/mixed")
>>>>> public StreamingOutput createItem(InputStream requestBodyStream) {
>>>>> /* read the requestBodyStream like a normal input stream */
>>>>> return new StreamingOutput() {
>>>>>
>>>>> public void write(OutputStream output) throws IOException,
>>>>> WebApplicationException {
>>>>> byte[] out = /* get some bytes to write */
>>>>> output.write(out);
>>>>> }
>>>>> })
>>>>> }
>>>>>
>>>>>
>>>> Can you replace the above with
>>>>
>>>> public StreamingOutput createItem(MultipartBody body) {
>>>>
>>>> // assuming a single attachment:
>>>> InputStream is =
>>>>body.getRootAttachment().getObject(InputStream.class);
>>>> //or
>>>>
>>>> InputStream is = body.getAttachmentObject("partId",
>>>>InputStream.class);
>>>>
>>>> }
>>>>
>>>> Quite a few other options are also possible, please see
>>>>
>>>> http://cxf.apache.org/docs/jax-rs-multiparts.html
>>>>
>>>> Let me know please if it works for you
>>>> HTH, Sergey
>>

Reply via email to