You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Diana ALLAM <al...@gmail.com> on 2012/06/12 15:33:12 UTC
How to request Put/Post restful methods without using an input file for the xml data
Hello,
Actually I am using the following code example to request a POST method on my Restful service:
-----------------------------------------------------------------------------------------------------------------------------------------------
System.out.println("Sent HTTP POST request to add customer");
inputFile = client.getClass().getResource("add_customer.xml").getFile();
resolver = new URIResolver(inputFile);
input = new File(resolver.getURI());
PostMethod post = new PostMethod("http://localhost:8080/CustomerRestfullTest/jaxrs/customerservice/customers");
post.addRequestHeader("Accept" , "text/xml");
entity = new FileRequestEntity(input, "text/xml; charset=ISO-8859-1");
post.setRequestEntity(entity);
httpclient = new HttpClient();
try {
int result = httpclient.executeMethod(post);
System.out.println("Response status code: " + result);
System.out.println("Response body: ");
System.out.println(post.getResponseBodyAsString());
} finally {
// Release current connection to the connection pool once you are
// done
post.releaseConnection();
}
-----------------------------------------------------------------------------------
My request is thus build by using an XML data file "add-customer.xml" where I can put for example:
<Customer>
<id>1</id>
<name>toto</name>
</Student>
I would like to do a similar request but instead of using the xml file I prefer to have a java class,
"Customer", and to do then something like that:
Customer c = new Customer(1, "toto");
PostMethod post = new PostMethod("http://localhost:8080/CustomerRestfullTest/jaxrs/customerservice/customers");
post.setRequest(c);
Is there a way to do that in cxf?
Regards,
Diana
Re: How to request Put/Post restful methods without using an input
file for the xml data
Posted by Sergey Beryozkin <sb...@gmail.com>.
Hi
For the proxy-based variant to work, one needs to have a Map jaxb
adapter available. Try using WebClient and do something like
client.get(String.class)
to get the same result you are seeing with the original code.
By the way, Jersey layer is probably interfering too, not sure how to
disable it in Grizzly, I done some experiments earlier on with Glassfish
OS edition, I ended up removing some of the Jersey related modules:
https://cwiki.apache.org/confluence/display/CXF20DOC/JAX-RS+Deployment#JAX-RSDeployment-Glassfish
Perhaps there's a better option
Cheers, Sergey
On 12/06/12 18:01, Diana ALLAM wrote:
> I have a problem using the jax-rs API using the following code:
>
> At the RESTful server I defined a Customer Service Class as follows:
> @Path("/customerservice/")
> public class CustomerService implements CustomerServiceInterface {
> long currentId = 123;
> Map<Long, Customer> customers = new HashMap<Long, Customer>();
> Map<Long, Order> orders = new HashMap<Long, Order>();
>
> public CustomerService() {
> init();
> }
>
>
> @GET
> public Map<Long, Customer> getCustomers(){
> returnthis.customers;
>
>
> }
>
> @GET
> @Path("/customers/{id}/")
> public Customer getCustomer(@PathParam("id") String id) {
> long idNumber = Long.parseLong(id);
> Customer c = customers.get(idNumber);
> return c;
> }
> ...
> }
>
> At the client side, I developed two applications:
>
> 1) First one which uses the old API:
>
> System.out.println("Sent HTTP GET request to query all customers info");
> URL url1 =
> newURL("http://localhost:8080/CustomerRestfullTest/jaxrs/customerservice/");
> InputStream in1 = url1.openStream();
> System.out.println(getStringFromInputStream(in1));
>
> // Sent HTTP GET request to query customer info
> System.out.println("Sent HTTP GET request to query customer info having
> the id 123");
> URL url =
> newURL("http://localhost:8080/CustomerRestfullTest/jaxrs/customerservice/customers/123");
> InputStream in = url.openStream();
> System.out.println(getStringFromInputStream(in));
>
>
> This one works without any error
>
> 2) Second one which uses the JAX-RS API:
>
> CustomerServiceInterface s =
> JAXRSClientFactory.create("http://localhost:8080/CustomerRestfullTest/jaxrs/",
> CustomerServiceInterface.class);
> Customer m = s.getCustomer("123");
> System.out.println("the result is m ID: "+ m.getId() + " m NAME:
> "+m.getName());
>
>
> Map<Long, Customer> map= s.getCustomers();
> System.out.println("Map is "+map);
>
>
>
> which gives an error when executing s.getCustomers().
> I can't understand the cause of this error. I tried to put a path to the
> method getCustomers() but it doesn't solve the problem.
> Any idea please?
>
> The result of the execution is :
>
> the result is m ID: 123 m NAME: John
> Exception in thread "main" Status : 500
> Headers :
> Content-Type : text/plain
> Transfer-Encoding : chunked
> Date : Tue, 12 Jun 2012 16:55:52 GMT
> Connection : close
> X-Powered-By : Servlet/3.0
> Server : GlassFish Server Open Source Edition 3.0.1
> Error message :
> javax.ws.rs.WebApplicationException: java.lang.NullPointerException
> at
> org.apache.cxf.jaxrs.provider.DataBindingProvider.writeTo(DataBindingProvider.java:101)
> at
> com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:289)
> at
> com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1029)
> at
> com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:941)
> at
> com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:932)
> at
> com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:384)
> at
> com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:451)
> at
> com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:632)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
> at
> org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)
> at
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
> at
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
> at
> org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
> at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
> at
> com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
> at
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
> at
> org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325)
> at
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226)
> at
> com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)
> at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
> at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
> at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
> at
> com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
> at
> com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
> at
> com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
> at
> com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
> at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
> at
> com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
> at
> com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
> at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
> at
> com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
> at
> com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
> at java.lang.Thread.run(Thread.java:680)
> Caused by: java.lang.NullPointerException
> at
> org.apache.cxf.jaxrs.provider.DataBindingProvider.writeToWriter(DataBindingProvider.java:106)
> at
> org.apache.cxf.jaxrs.provider.DataBindingProvider.writeTo(DataBindingProvider.java:99)
> ... 32 more
>
>
> at
> org.apache.cxf.jaxrs.client.ClientProxyImpl.checkResponse(ClientProxyImpl.java:250)
> at
> org.apache.cxf.jaxrs.client.ClientProxyImpl.handleResponse(ClientProxyImpl.java:517)
> at
> org.apache.cxf.jaxrs.client.ClientProxyImpl.doChainedInvocation(ClientProxyImpl.java:487)
> at
> org.apache.cxf.jaxrs.client.ClientProxyImpl.invoke(ClientProxyImpl.java:188)
> at $Proxy18.getCustomers(Unknown Source)
> at demo.client.Client1.main(Client1.java:17)
>
>
>
> On 12 juin 2012, at 15:49, Sergey Beryozkin wrote:
>
>> Hi
>> On 12/06/12 14:33, Diana ALLAM wrote:
>>> Hello,
>>>
>>> Actually I am using the following code example to request a POST
>>> method on my Restful service:
>>> -----------------------------------------------------------------------------------------------------------------------------------------------
>>> System.out.println("Sent HTTP POST request to add customer");
>>> inputFile = client.getClass().getResource("add_customer.xml").getFile();
>>> resolver = new URIResolver(inputFile);
>>> input = new File(resolver.getURI());
>>> PostMethod post = new
>>> PostMethod("http://localhost:8080/CustomerRestfullTest/jaxrs/customerservice/customers");
>>> post.addRequestHeader("Accept" , "text/xml");
>>> entity = new FileRequestEntity(input, "text/xml; charset=ISO-8859-1");
>>> post.setRequestEntity(entity);
>>> httpclient = new HttpClient();
>>>
>>> try {
>>> int result = httpclient.executeMethod(post);
>>> System.out.println("Response status code: " + result);
>>> System.out.println("Response body: ");
>>> System.out.println(post.getResponseBodyAsString());
>>> } finally {
>>> // Release current connection to the connection pool once you are
>>> // done
>>> post.releaseConnection();
>>> }
>>> -----------------------------------------------------------------------------------
>>> My request is thus build by using an XML data file "add-customer.xml"
>>> where I can put for example:
>>> <Customer>
>>> <id>1</id>
>>> <name>toto</name>
>>> </Student>
>>>
>>> I would like to do a similar request but instead of using the xml
>>> file I prefer to have a java class,
>>> "Customer", and to do then something like that:
>>> Customer c = new Customer(1, "toto");
>>> PostMethod post = new
>>> PostMethod("http://localhost:8080/CustomerRestfullTest/jaxrs/customerservice/customers");
>>> post.setRequest(c);
>>>
>>> Is there a way to do that in cxf?
>>>
>> The above is an old example code which uses HttpClient, try this api
>> instead:
>>
>> http://cxf.apache.org/docs/jax-rs-client-api.html
>>
>> Cheers, Sergey
>>> Regards,
>>>
>>> Diana
>>>
>>>
>>
>>
>> --
>> Sergey Beryozkin
>>
>> Talend Community Coders
>> http://coders.talend.com/
>>
>> Blog: http://sberyozkin.blogspot.com
>
--
Sergey Beryozkin
Talend Community Coders
http://coders.talend.com/
Blog: http://sberyozkin.blogspot.com
Re: How to request Put/Post restful methods without using an input file for the xml data
Posted by Diana ALLAM <al...@gmail.com>.
I have a problem using the jax-rs API using the following code:
At the RESTful server I defined a Customer Service Class as follows:
@Path("/customerservice/")
public class CustomerService implements CustomerServiceInterface {
long currentId = 123;
Map<Long, Customer> customers = new HashMap<Long, Customer>();
Map<Long, Order> orders = new HashMap<Long, Order>();
public CustomerService() {
init();
}
@GET
public Map<Long, Customer> getCustomers(){
return this.customers;
}
@GET
@Path("/customers/{id}/")
public Customer getCustomer(@PathParam("id") String id) {
long idNumber = Long.parseLong(id);
Customer c = customers.get(idNumber);
return c;
}
...
}
At the client side, I developed two applications:
1) First one which uses the old API:
System.out.println("Sent HTTP GET request to query all customers info");
URL url1 = new URL("http://localhost:8080/CustomerRestfullTest/jaxrs/customerservice/");
InputStream in1 = url1.openStream();
System.out.println(getStringFromInputStream(in1));
// Sent HTTP GET request to query customer info
System.out.println("Sent HTTP GET request to query customer info having the id 123");
URL url = new URL("http://localhost:8080/CustomerRestfullTest/jaxrs/customerservice/customers/123");
InputStream in = url.openStream();
System.out.println(getStringFromInputStream(in));
This one works without any error
2) Second one which uses the JAX-RS API:
CustomerServiceInterface s = JAXRSClientFactory.create("http://localhost:8080/CustomerRestfullTest/jaxrs/", CustomerServiceInterface.class);
Customer m = s.getCustomer("123");
System.out.println("the result is m ID: "+ m.getId() + " m NAME: "+m.getName());
Map<Long, Customer> map= s.getCustomers();
System.out.println("Map is "+map);
which gives an error when executing s.getCustomers().
I can't understand the cause of this error. I tried to put a path to the method getCustomers() but it doesn't solve the problem.
Any idea please?
The result of the execution is :
the result is m ID: 123 m NAME: John
Exception in thread "main" Status : 500
Headers :
Content-Type : text/plain
Transfer-Encoding : chunked
Date : Tue, 12 Jun 2012 16:55:52 GMT
Connection : close
X-Powered-By : Servlet/3.0
Server : GlassFish Server Open Source Edition 3.0.1
Error message :
javax.ws.rs.WebApplicationException: java.lang.NullPointerException
at org.apache.cxf.jaxrs.provider.DataBindingProvider.writeTo(DataBindingProvider.java:101)
at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:289)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1029)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:941)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:932)
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:384)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:451)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:632)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
at java.lang.Thread.run(Thread.java:680)
Caused by: java.lang.NullPointerException
at org.apache.cxf.jaxrs.provider.DataBindingProvider.writeToWriter(DataBindingProvider.java:106)
at org.apache.cxf.jaxrs.provider.DataBindingProvider.writeTo(DataBindingProvider.java:99)
... 32 more
at org.apache.cxf.jaxrs.client.ClientProxyImpl.checkResponse(ClientProxyImpl.java:250)
at org.apache.cxf.jaxrs.client.ClientProxyImpl.handleResponse(ClientProxyImpl.java:517)
at org.apache.cxf.jaxrs.client.ClientProxyImpl.doChainedInvocation(ClientProxyImpl.java:487)
at org.apache.cxf.jaxrs.client.ClientProxyImpl.invoke(ClientProxyImpl.java:188)
at $Proxy18.getCustomers(Unknown Source)
at demo.client.Client1.main(Client1.java:17)
On 12 juin 2012, at 15:49, Sergey Beryozkin wrote:
> Hi
> On 12/06/12 14:33, Diana ALLAM wrote:
>> Hello,
>>
>> Actually I am using the following code example to request a POST method on my Restful service:
>> -----------------------------------------------------------------------------------------------------------------------------------------------
>> System.out.println("Sent HTTP POST request to add customer");
>> inputFile = client.getClass().getResource("add_customer.xml").getFile();
>> resolver = new URIResolver(inputFile);
>> input = new File(resolver.getURI());
>> PostMethod post = new PostMethod("http://localhost:8080/CustomerRestfullTest/jaxrs/customerservice/customers");
>> post.addRequestHeader("Accept" , "text/xml");
>> entity = new FileRequestEntity(input, "text/xml; charset=ISO-8859-1");
>> post.setRequestEntity(entity);
>> httpclient = new HttpClient();
>>
>> try {
>> int result = httpclient.executeMethod(post);
>> System.out.println("Response status code: " + result);
>> System.out.println("Response body: ");
>> System.out.println(post.getResponseBodyAsString());
>> } finally {
>> // Release current connection to the connection pool once you are
>> // done
>> post.releaseConnection();
>> }
>> -----------------------------------------------------------------------------------
>> My request is thus build by using an XML data file "add-customer.xml" where I can put for example:
>> <Customer>
>> <id>1</id>
>> <name>toto</name>
>> </Student>
>>
>> I would like to do a similar request but instead of using the xml file I prefer to have a java class,
>> "Customer", and to do then something like that:
>> Customer c = new Customer(1, "toto");
>> PostMethod post = new PostMethod("http://localhost:8080/CustomerRestfullTest/jaxrs/customerservice/customers");
>> post.setRequest(c);
>>
>> Is there a way to do that in cxf?
>>
> The above is an old example code which uses HttpClient, try this api instead:
>
> http://cxf.apache.org/docs/jax-rs-client-api.html
>
> Cheers, Sergey
>> Regards,
>>
>> Diana
>>
>>
>
>
> --
> Sergey Beryozkin
>
> Talend Community Coders
> http://coders.talend.com/
>
> Blog: http://sberyozkin.blogspot.com
Re: How to request Put/Post restful methods without using an input
file for the xml data
Posted by Sergey Beryozkin <sb...@gmail.com>.
Hi
On 12/06/12 14:33, Diana ALLAM wrote:
> Hello,
>
> Actually I am using the following code example to request a POST method on my Restful service:
> -----------------------------------------------------------------------------------------------------------------------------------------------
> System.out.println("Sent HTTP POST request to add customer");
> inputFile = client.getClass().getResource("add_customer.xml").getFile();
> resolver = new URIResolver(inputFile);
> input = new File(resolver.getURI());
> PostMethod post = new PostMethod("http://localhost:8080/CustomerRestfullTest/jaxrs/customerservice/customers");
> post.addRequestHeader("Accept" , "text/xml");
> entity = new FileRequestEntity(input, "text/xml; charset=ISO-8859-1");
> post.setRequestEntity(entity);
> httpclient = new HttpClient();
>
> try {
> int result = httpclient.executeMethod(post);
> System.out.println("Response status code: " + result);
> System.out.println("Response body: ");
> System.out.println(post.getResponseBodyAsString());
> } finally {
> // Release current connection to the connection pool once you are
> // done
> post.releaseConnection();
> }
> -----------------------------------------------------------------------------------
> My request is thus build by using an XML data file "add-customer.xml" where I can put for example:
> <Customer>
> <id>1</id>
> <name>toto</name>
> </Student>
>
> I would like to do a similar request but instead of using the xml file I prefer to have a java class,
> "Customer", and to do then something like that:
> Customer c = new Customer(1, "toto");
> PostMethod post = new PostMethod("http://localhost:8080/CustomerRestfullTest/jaxrs/customerservice/customers");
> post.setRequest(c);
>
> Is there a way to do that in cxf?
>
The above is an old example code which uses HttpClient, try this api
instead:
http://cxf.apache.org/docs/jax-rs-client-api.html
Cheers, Sergey
> Regards,
>
> Diana
>
>
--
Sergey Beryozkin
Talend Community Coders
http://coders.talend.com/
Blog: http://sberyozkin.blogspot.com