Hi Andrei

I checked the code, setting the contextual property "support.type.as.multipart" should be enough as long as the type is a built-in type like InputStream.

I also can see @Multipart annotations can be added for the input params, but not as a method annotation

Thanks, Sergey

On 04/04/17 16:24, Andrei Shakirin wrote:
Hi Sergey,

Thanks for the answer.

Regarding @Multipart method annotation, is there any way to initiate generation 
of this annotation through the WADL? (project uses WADL fist approach)

Regards,
Andrei.

-----Original Message-----
From: Sergey Beryozkin [mailto:[email protected]]
Sent: Dienstag, 4. April 2017 16:53
To: [email protected]
Cc: Sergey Beryozkin; Dmitry Tsybulko
Subject: Re: Multipart body with proxy client

Hi Andriy

What changed in JAX-RS 2.0, and which annoyed me quite a bit at a time, was
that in JAX-RS 2.0 native types like InputStream have to be processed by the
default handlers, ex, in case of InputStream it would be basically IOUtils.copy,
etc, which started breaking the attachments code where individual part was
represented as InputStream or String for ex. That was done to support wildcard
handlers like Jackson which would blindly accept any type as long as it is
application/json.

InpputStream parts can still be supported by CXF RS multipart code but as long
as they have @Multipart annotations.

I can assume that the reason the code below fails is because an individual
Attachment is using InputStream.

Try adding @Multipart method annotation, without any properties, that should
help

Thanks, Sergey




On 04/04/17 15:18, Andrei Shakirin wrote:
Hi Sergey,

I have discovered one difference in processing of mutipart body by client
proxy after migration to CXF 3:

1. Server method described by following interface (generated from WADL):
  @GET
  @Produces("multipart/mixed")
  @Path
  Response getSomething();

2. Implementation :
  Response getSomething() {
           MyResponse myResponse;// init it here
           List<Attachment> attachments = new LinkedList<>();
           attachments.add(new Attachment("response",
MediaType.APPLICATION_XML_TYPE.toString(), myResponse));
          // it can be added other attachments
          return Response.ok().entity(attachments).build();
  }

3.  On client side we create service proxy for calling the method
    final T serviceProxy = JAXRSClientFactory.create(baseURL + serviceURL,
serviceClass, new ArrayList<>(), features, null);
    Response response = serviceProxy.getSomething();
    MyResponse myResponse = response.readEntity(MyResponse.class);

It works for CXF 2.7.11, but for CXF 3.1.7 we get following exception:
javax.ws.rs.client.ResponseProcessingException: No message body reader has
been found for class MyResponse, ContentType:
multipart/mixed;boundary="uuid:e7578110-29f1-4125-848e-dc9230887d45".

For CXF 3.1.7 code works without problems if we use Client API to read set of
attachments.

Do you have any ideas why it works differently? It is not a big issue, because
WebClient / Client API works - anyway interesting to understand the difference.

Regards,
Andrei.



--
Sergey Beryozkin

Talend Community Coders
http://coders.talend.com/

Reply via email to