Ok, I didn't get it all...
I'm not familiar with MessageBodyReader and MessageBodyWorkers but I need to
do something like that:
@PUT
@Path("/new")
        public String testPut(MultipartDataSource dataSource) {
              Customer c = getCustomer(dataSource.getBodyPart(0));
              ZipInputStream is = getStream(dataSource.getBodyPart(1));
        }

where dataSource.getBodyPart(0) is a xml file and dataSource.getBodyPart(1)
is a zip file.

Furthermore, how can I send a MultipleDataSource object from the client?

Thanks for your support

Cheers

Ramju




Sergey Beryozkin wrote:
> 
> I meant to send this message yesterday evening but got distracted a bit
> ...
> 
> I think you're after a multipart-related content type (or some other
> multipart/*). At the moment CXF JAX-RS does not support a 
> javax.activation.DataSource or
> other Java Activation Framework types. JAX-RS spec requires that
> DataSource is supported out of the box - so CXF JAX-RS will do it
> eventually - given that there's a fairly advanced support for it in the
> XmlBinding available already.
> 
> In meantime, a workaround is to write a custom message body reader which
> will use a JAF to convert an input stream into, say,
> MultipartDataSource[1] and use a signature like this one :
> 
> @PUT
> @Path("/new")
>         public String testPut(MultipartDataSource dataSource) {
>               Customer c = getCustomer(dataSource.getBodyPart(0));
>               ZipInputStream is = getStream(dataSource.getBodyPart(1));
>         }
> 
> This is a bit too low-level but it's doable.
> 
> Now, you can actually hide all this code in the MessageBodyReader,
> possibly relying on JAX-RS MessageBodyWorkers :
> 
> public class CustomerInfoReader implements MessageBodyReader<CustomerInfo>
> {
>      @Context HttpHeaders headers;
>      @Context MessageBodyWorkers workers;
> 
>       public boolean isReadable(...) {
>            return
> "multipart/related".equals(headers.getMediaType().toString());
>       }
> 
>       public CustomerInfo readFrom(..., InputStream is) {
> 
>            CustomerInfo customerInfo = new CustomerInfo();
>            // use JAF to do it or look at the CXF source code, I don't
> remember the detail :-)
>            MultipartDataSource source = getFrom(is);
>            BodyPart part1 = source.getBodyPart(0);
>            // use JAXB directly or rely on a provided JAXB reader :
> 
>            Customer c = workers.getMessageBodyReader(Customer.class,
>                                                  
> MediaType.valueOf(part1.getContentType()), new
> Annotation[]{}).readFrom(...,
> part1.getInputStream());
> 
> 
>            customerInfo.setCustomer(c);
>            customerInfo.setCustomerAttachment(source.getBodyPart(1));
>            return customerInfo;
>       }
> 
> 
> }
> 
> @PUT
> @Path("/new")
>  public String testPut(CustomerInfo ci) {
>  }
> 
> Perhaps its the best option if you'd like to keep the low-level details
> out of the application code.
> 
> If you wanted to upload only a file then you'd have more simpler options,
> like using InputStream or Reader in the method signature 
> for ex...
> 
> Cheers, Sergey
> 
> [1]
> http://java.sun.com/j2ee/1.4/docs/api/javax/mail/MultipartDataSource.html
> 
> ----- Original Message ----- 
> From: "deniak" <[EMAIL PROTECTED]>
> To: <[email protected]>
> Sent: Thursday, July 31, 2008 9:13 AM
> Subject: Re: CXF and http body
> 
> 
>>
>> Ok, but what can I do if I'd like to send the XML file (with
>> RequestEntity)
>> and a zip file
>> include in the request??
>>
>>
>>
>>
>>
>> Arul Dhesiaseelan wrote:
>>>
>>> setRequestBody is deprecated in HttpClient 3.x. You should instead use
>>> setRequestEntity(RequestEntity).
>>>
>>> setRequestBody is removed in HttpClient 4.x.
>>>
>>> AFAIK, Jersey (JAX-RS implementation from Sun) Client API does not
>>> support this method.
>>>
>>> -Arul
>>>
>>> deniak wrote:
>>>> Hi all,
>>>>
>>>> I'm just starting with web services and CXF and I'd like to know if
>>>> it's
>>>> possible to deal with the request body with CXF.
>>>>
>>>> I just created a client like that:
>>>>
>>>> File customer = new File("pathToXMLFile");
>>>> File body = new File("AZipFile");
>>>> PutMethod put = new PutMethod("http://localhost:8080/test/new";);
>>>> put.addRequestHeader("Accept", "text/xml");
>>>> FileRequestEntity entity = new FileRequestEntity(customer, "text/xml;
>>>> charset=ISO-8859-1");
>>>> put.setRequestEntity(entity);
>>>> put.setRequestBody(body);
>>>> HttpClient httpclient = new HttpClient();
>>>> httpclient.executeMethod(put);
>>>>
>>>>
>>>> Here's my server:
>>>>
>>>> @Path("test")
>>>> public class TestServlet {
>>>>         @PUT
>>>> @Path("/new")
>>>>         public String testPut(Customer customer) {
>>>>               .....
>>>>         }
>>>> }
> 
> ----------------------------
> IONA Technologies PLC (registered in Ireland)
> Registered Number: 171387
> Registered Address: The IONA Building, Shelbourne Road, Dublin 4, Ireland
> 
> 

-- 
View this message in context: 
http://www.nabble.com/CXF-and-http-body-tp18736318p18756553.html
Sent from the cxf-user mailing list archive at Nabble.com.

Reply via email to