Hi, Sergey

Now, Everything works fine. 

Thanks for your help.


--- On Thu, 2/3/11, acec acec <[email protected]> wrote:

> From: acec acec <[email protected]>
> Subject: Re: some questions about cxf rest uploading file
> To: [email protected]
> Received: Thursday, February 3, 2011, 1:56 PM
> Thanks for your help.
> 
> The following is my new code according to your suggestion,
> but I still got 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:323)
> 
> --------------------
> String address = "http://localhost:8080/spring_cxf_rest/rest/postPicture";;
> JAXRSClientFactoryBean bean = new
> JAXRSClientFactoryBean();
> bean.setAddress(address);
> bean.setProperties(Collections.singletonMap(org.apache.cxf.message.Message.MTOM_ENABLED,(Object)"true"));
> WebClient client = bean.createWebClient();
> client.type("multipart/related").accept("multipart/related");
> 
> 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);
> 
> client.post(picture, Picture.class);
> --------------------
> --- 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, 1:31 PM
> > 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