CXF 2.3.2 should give a better error message.
You need to set multipart/related and also set the mtop-enabled property on
the web client side.

With a proxy you can use a CXF EndpointProperty annotation, with WebClient
you need to set it on the JAXRSClientFactoryBean and then do
createWebClient().
Setting it on webClient.getRequestContext() should also work.

Would you consider looking at the jaxrs_attachments demo [1] ?

Registration is needed :
[1] http://www.talend.com/resources/documentation.php#SF

cheers, Sergey

On Thu, Feb 3, 2011 at 6:23 PM, acec acec <[email protected]> wrote:

> Thanks a lot.
>
> I try to use XOP, the following is my code and configuration.
>
> In my junit code, I got the following error message.
> ------------------------------------------------------
> org.apache.cxf.interceptor.Fault: .Problem with writing the request
> message, class : class example.cxf.Picture.
>        at
> org.apache.cxf.jaxrs.client.WebClient$BodyWriter.handleMessage(WebClient.java:679)
>        at
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255)
>        at
> org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:615)
>        at
> org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:595)
>        at org.apache.cxf.jaxrs.client.WebClient.invoke(WebClient.java:240)
>        at org.apache.cxf.jaxrs.client.WebClient.post(WebClient.java:249)
>        at
> arden.example.cxf.CxfClientTest.postPicture(CxfClientTest.java:33)
>        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.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
>        at
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
>        at
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
>        at
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
>        at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
>        at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
>        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
>        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
>        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
>        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
>        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
>        at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
>        at
> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
>        at
> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>        at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
>        at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
>        at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
>        at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
> Caused by: org.apache.cxf.jaxrs.client.ClientWebApplicationException:
> .Problem with writing the request message, class : class
> example.cxf.Picture.
>        at
> org.apache.cxf.jaxrs.client.AbstractClient.reportMessageHandlerProblem(AbstractClient.java:506)
>        at
> org.apache.cxf.jaxrs.client.AbstractClient.writeBody(AbstractClient.java:406)
>        at
> org.apache.cxf.jaxrs.client.WebClient$BodyWriter.handleMessage(WebClient.java:673)
>        ... 28 more
> Caused by: javax.ws.rs.WebApplicationException
>        at
> org.apache.cxf.jaxrs.provider.MultipartProvider.getHandlerForObject(MultipartProvider.java:320)
>        at
> org.apache.cxf.jaxrs.provider.MultipartProvider.createDataHandler(MultipartProvider.java:291)
>        at
> org.apache.cxf.jaxrs.provider.MultipartProvider.convertToDataHandlers(MultipartProvider.java:246)
>        at
> org.apache.cxf.jaxrs.provider.MultipartProvider.writeTo(MultipartProvider.java:212)
>        at
> org.apache.cxf.jaxrs.client.AbstractClient.writeBody(AbstractClient.java:401)
>        ... 29 more
>
>
>
> -----------------------------------------
> import javax.activation.DataHandler;
> import javax.activation.DataSource;
> import javax.activation.FileDataSource;
> import javax.ws.rs.core.Response;
>
> public class CxfClientTest {
>
> @Test
> public void postPicture() throws FileNotFoundException {
>  File uploadFile = new File("/tmp/Citi.pdf");
>  DataSource source = new FileDataSource(uploadFile);
>  DataHandler dataHandler = new DataHandler(source);
>  Picture picture = new Picture(new Date(), "picture");
>  picture.setData(dataHandler);
>
>  WebClient client = WebClient.create("
> http://localhost:8080/spring_cxf_rest/rest/postPicture";);
>  client.type("multipart/mixed").accept("multipart/mixed");
>
>  Response response = client.post(picture);
>  System.out.println(response.getStatus());
> }
> -----------------------------------------
> <jaxrs:server id="restContainer" address="/">
>                <jaxrs:serviceBeans>
>                        <ref bean="testService"/>
>                </jaxrs:serviceBeans>
>                <jaxrs:properties>
>                <entry key="mtom-enabled" value="true"/>
>                </jaxrs:properties>
>        </jaxrs:server>
> -------------------------------------------
> @XmlType
> public class Picture {
>         private Date time;
>        private String name;
>         @XmlMimeType("application/octet-stream")
>        private DataHandler data;
>
> ===============================================================
>
>
> --- On Thu, 2/3/11, Sergey Beryozkin <[email protected]> wrote:
>
> > From: Sergey Beryozkin <[email protected]>
> > Subject: Re: some questions about cxf rest uploading file
> > To: [email protected]
> > Received: Thursday, February 3, 2011, 12:39 PM
> > Hi
> >
> > On Thu, Feb 3, 2011 at 5:25 PM, acec acec <[email protected]>
> > wrote:
> >
> > > Thanks a lot.
> > > When I try the following Book class, everything is
> > ok.
> > > ----------------------
> > > Book b =
> > multipartBody.getAttachment(partContentId).getObject(Book.class)
> > >
> > > @XmlRootElement(name = "book")
> > > public class Book {
> > >        private Date time;
> > >        private String name;
> > > ...
> > > getter/setter
> > > }
> > >
> >
> > ok
> >
> >
> > > ----------------------
> > > But after I change Book class like the following, I
> > got some error message.
> > > public class Book {
> > >        private Date time;
> > >        private String name;
> > >        private InputStream
> > inputStream;
> > > ...
> > > Seems I can not include inputStream into Book class,
> > and I have to use
> > > different contentId attach InputStream separately.
> > >
> > >
> > If you XOP then you can include InputStream inside the
> > Book...But you'd need
> > to use WebClient for that to work :-)
> >
> > cheers, Sergey
> >
> >
> >
> > > Regards.
> > >
> > >
> > > --- On Thu, 2/3/11, Sergey Beryozkin <[email protected]>
> > wrote:
> > >
> > > > From: Sergey Beryozkin <[email protected]>
> > > > Subject: Re: some questions about cxf rest
> > uploading file
> > > > To: [email protected]
> > > > Received: Thursday, February 3, 2011, 11:41 AM
> > > > > 2) According to cxf guide "When
> > > > handling complex multipart/form-data
> > > > >> submissions (such as those containing
> > files)
> > > > MultipartBody (and Attachment)
> > > > >> need to be used directly."
> > > > >>
> > > > >> MultipartBody or List<Attachment>,
> > provided
> > > > it is a real
> > > > > multipart/form-data submission (with
> > recursive parts)
> > > > >
> > > > >
> > > > >> When I handle the above form, I have to
> > use
> > > > MultipartBody, is there easy
> > > > >> way to parse text input and file input
> > from
> > > > MultipartBody?
> > > > >>
> > > > >>
> > > > > Assuming the JAX-RS provider is available
> > which can
> > > > handle the content of
> > > > > the file then yes. Example, if a given file
> > represents
> > > > a Book XML instance
> > > > > then you can do
> > > > >
> > > > > Book b =
> > > >
> > multipartBody.getAttachment(partContentId).getObject(Book.class)
> > > > >
> > > > > or
> > > > >
> > > > > Book b =
> > > > multipartBody.getAttachmentObject(partContentId,
> > > > Book.class)
> > > > >
> > > > >
> > > > or if all the attachment parts have the same
> > content type
> > > > then simply
> > > >
> > > > for (Attachment att : listofAttachments) {
> > > >     Book b =
> > att.getObject(Book.class);
> > > > }
> > > >
> > > >
> > > > > Cheers, Sergey
> > > > >
> > > > > Regards.
> > > > >>
> > > > >>
> > > > >> --- On Thu, 2/3/11, Sergey Beryozkin
> > <[email protected]>
> > > > wrote:
> > > > >>
> > > > >> > From: Sergey Beryozkin <[email protected]>
> > > > >> > Subject: Re: some questions about
> > cxf rest
> > > > uploading file
> > > > >> > To: [email protected]
> > > > >> > Received: Thursday, February 3,
> > 2011, 9:54
> > > > AM
> > > > >> > Hi
> > > > >> >
> > > > >> > On Thu, Feb 3, 2011 at 2:29 PM,
> > acec acec
> > > > <[email protected]>
> > > > >> > wrote:
> > > > >> >
> > > > >> > > Hi, all
> > > > >> > > I am using the following code
> > to upload
> > > > a file. It
> > > > >> > works fine.
> > > > >> > >
> > > > >> > > But I have several questions:
> > > > >> > > 1) If I change
> > body.getAllAttachments()
> > > > ==>
> > > > >> > body.getAttachment(contentId),
> > > > >> > > What does mean "contentId"? In
> > my junit
> > > > code, How can
> > > > >> > I set that contentId?
> > > > >> > >
> > > > >> > > Content-Id the id of the
> > individual
> > > > multi-part; sure,
> > > > >> > if you know the
> > > > >> > contentId then you can use
> > > > >> >
> > > > >> > body.getAttachment(contentId)
> > > > >> >
> > > > >> >
> > > > >> > > 2)Can I get original file name
> > on server
> > > > side? I
> > > > >> > tried
> > > > >> > > dataHandler.getName(), but it
> > return
> > > > null.
> > > > >> > >
> > > > >> > >
> > > > >> > If it's a multipart/form-data then
> > you can
> > > > get a
> > > > >> > ContentDisposition header
> > > > >> > from the Attachment and get the
> > name;
> > > > otherwise you can
> > > > >> > just introduce a
> > > > >> > custom header and use it during the
> > creation
> > > > of the
> > > > >> > individual part and then
> > > > >> > retrieve it from Attachment.
> > > > >> >
> > > > >> >
> > > > >> > > 3)In my junit code, when I add
> > Part
> > > > using
> > > > >> > (reqEntity.addPart("file1",
> > > > >> > > fileBody)), how can I retrieve
> > the name
> > > > "file1" from
> > > > >> > my server side?
> > > > >> > >
> > > > >> > > You're using the the Apache
> > Http Client,
> > > > so I'm not
> > > > >> > sure what exactly it
> > > > >> > produces. If it's a
> > multipart/form-data
> > > > request then on the
> > > > >> > cxf side do
> > > > >> > attachment.getContentDisposition()
> > and get
> > > > the file name
> > > > >> >
> > > > >> >
> > > > >> > > 4)I never use MTOM, when I am
> > using the
> > > > following code
> > > > >> > to upload one PDF
> > > > >> > > file, does is use base64?
> > > > >> > >
> > > > >> > >
> > > > >> > Not sure what Apache HttpClient
> > does there
> > > > >> >
> > > > >> > Cheers, Sergey
> > > > >> >
> > > > >> >
> > > > >> > > Thanks a lot.
> > > > >> > >
> > > > >> > > ===============Server side
> > > > >> > coe===============================
> > > > >> > > @POST
> > > > >> > > @Path("/upload/book")
> > > > >> > > public void
> > postBook(MultipartBody body)
> > > > {
> > > > >> > >  try {
> > > > >> > >
> > System.out.println("start post");
> > > > >> > >  List<Attachment>
> > attachments
> > > > =
> > > > >> > body.getAllAttachments();
> > > > >> > >  DataHandler dataHandler
> > =
> > > > >> >
> > attachments.get(0).getDataHandler();
> > > > >> > >  InputStream inputStream
> > =
> > > > >> > dataHandler.getInputStream();
> > > > >> > >  OutputStream
> > outputStream = new
> > > > >> > FileOutputStream(new
> > > > >> > > File("/tmp/new.pdf"));
> > > > >> > >
> > IOUtils.copy(inputStream,
> > > > outputStream);
> > > > >> > >  inputStream.close();
> > > > >> > >  outputStream.close();
> > > > >> > >  System.out.println("end
> > post");
> > > > >> > > } catch (Exception e) {
> > > > >> > >
> > System.out.println("Exception");
> > > > >> > > }
> > > > >> > > }
> > > > >> > >
> > > > >> > > ====================My
> > > > >> > Junit==========================
> > > > >> > > public class UploadClassTest
> > {
> > > > >> > >  @Test
> > > > >> > >  public void
> > uploadClass() throws
> > > > >> > ClientProtocolException,
> > IOException {
> > > > >> > >   HttpClient
> > httpClient =
> > > > new
> > > > >> > DefaultHttpClient();
> > > > >> > >   HttpPost
> > httpPost = new
> > > > HttpPost("
> > > > >> > > http://localhost:8080/spring_cxf_rest/rest/upload/book";);
> > > > >> > >
> > > > >> > >   FileBody
> > fileBody = new
> > > > FileBody(new
> > > > >> > File("/tmp/Citi.pdf"));
> > > > >> > >
> > > > >> >
> > >   MultipartEntity
> > > > reqEntity = new
> > > > >> > MultipartEntity();
> > > > >> >
> > > > >   reqEntity.addPart("file1",
> > > > >> > fileBody);
> > > > >> > >
> > > > >> >
> > > >
> > >   httpPost.setEntity(reqEntity);
> > > > >> > >
> > > > >> >
> > > >
> > >   httpClient.execute(httpPost);
> > > > >> > >  }
> > > > >> > > }
> > > > >> > >
> > > > >> > >
> > > > >> > >
> > > > >> >
> > > > >>
> > > > >>
> > > > >>
> > > > >
> > > >
> > >
> > >
> > >
> >
>
>
>

Reply via email to