users@jersey.java.net

Re: [Jersey] Issues with POST on a sub-resource

From: Arul Dhesiaseelan <arul_at_fluxcorp.com>
Date: Mon, 20 Oct 2008 10:51:52 -0600

Thanks Paul.

How can I locate my sub-resource from the root resource in this case,
where my sub-resource is not invoked from parent resource?

Basically, I am looking for implementing a similar uri schema:

/customerservice
/customerservice/cs1
/customerservice/cs1/customers/c1
/customerservice/cs1/customers/c2
/customerservice/cs2
/customerservice/cs2/customers/c3

-Arul

Paul Sandoz wrote:
> Hi Arul,
>
> You cannot have the entity parameter on the sub-resource locator
> method signature:
>
> @Path("customers")
> public CustomerResource getCustomerResource(Customer pojo) {
> return new CustomerResource(uriInfo, request, pojo);
> }
>
> You need to place entity parameter on the resource method of the
> sub-resource class:
>
> @POST
> @Consumes("application/xml")
> @Produces("application/xml")
> public Customer addCustomer(Customer customer) {
> URI uri = uriInfo.getAbsolutePath();
> customer.setUri(uri.toString());
> return customer;
> }
>
> Paul.
>
> On Oct 20, 2008, at 6:30 PM, Arul Dhesiaseelan wrote:
>
>> Hi,
>>
>> I am having issues with creating a sub-resource (using POST). I am
>> attaching the test case for my use case. I used Jersey 1.0 for this
>> testing. May be I am missing something completely.
>>
>> I get the following exception when I try to create a new customer
>> using a sub-resource:
>>
>> Oct 20, 2008 10:22:52 AM
>> com.sun.jersey.api.core.PackagesResourceConfig init
>> INFO: Scanning for root resource and provider classes in the packages:
>> sample
>> Oct 20, 2008 10:22:52 AM
>> com.sun.jersey.api.core.PackagesResourceConfig init
>> INFO: Root resource classes found:
>> class sample.TestSubResource$JerseyResource
>> Oct 20, 2008 10:22:52 AM
>> com.sun.jersey.api.core.PackagesResourceConfig init
>> INFO: Provider classes found:
>> Oct 20, 2008 10:22:52 AM com.sun.grizzly.http.servlet.ServletAdapter
>> service
>> SEVERE: service exception:
>> javax.servlet.ServletException:
>> com.sun.jersey.api.container.ContainerException: Exception injecting
>> parameters to dynamic resolving method
>> at
>> com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:346)
>>
>> at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
>> at
>> com.sun.grizzly.http.servlet.FilterChainImpl.doFilter(FilterChainImpl.java:141)
>>
>> at
>> com.sun.grizzly.http.servlet.ServletAdapter.service(ServletAdapter.java:233)
>>
>> at
>> com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:147)
>>
>> at
>> com.sun.grizzly.http.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:625)
>>
>> at
>> com.sun.grizzly.http.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:562)
>>
>> at
>> com.sun.grizzly.http.DefaultProcessorTask.process(DefaultProcessorTask.java:819)
>>
>> at
>> com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:152)
>>
>> at
>> com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:136)
>>
>> at
>> com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:103)
>>
>> at
>> com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:89)
>>
>> at
>> com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
>>
>> at
>> com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:67)
>>
>> at
>> com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:56)
>>
>> at
>> com.sun.grizzly.util.WorkerThreadImpl.processTask(WorkerThreadImpl.java:325)
>>
>> at
>> com.sun.grizzly.util.WorkerThreadImpl.run(WorkerThreadImpl.java:184)
>> Caused by: com.sun.jersey.api.container.ContainerException: Exception
>> injecting parameters to dynamic resolving method
>> at
>> com.sun.jersey.impl.uri.rules.SubLocatorRule.invokeSubLocator(SubLocatorRule.java:119)
>>
>> at
>> com.sun.jersey.impl.uri.rules.SubLocatorRule.accept(SubLocatorRule.java:75)
>>
>> at
>> com.sun.jersey.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:111)
>>
>> at
>> com.sun.jersey.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:71)
>>
>> at
>> com.sun.jersey.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:111)
>>
>> at
>> com.sun.jersey.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:63)
>>
>> at
>> com.sun.jersey.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:722)
>>
>> at
>> com.sun.jersey.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:692)
>>
>> at
>> com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:344)
>>
>> ... 16 more
>> Caused by: java.lang.NullPointerException
>> at
>> com.sun.jersey.impl.uri.rules.SubLocatorRule.invokeSubLocator(SubLocatorRule.java:103)
>>
>> ... 24 more
>>
>> com.sun.jersey.api.client.UniformInterfaceException: Status: 500
>> at com.sun.jersey.api.client.WebResource.handle(WebResource.java:468)
>> at
>> com.sun.jersey.api.client.WebResource.access$200(WebResource.java:64)
>> at
>> com.sun.jersey.api.client.WebResource$Builder.post(WebResource.java:404)
>> at
>> sample.TestSubResource.testCustomerSubResource(TestSubResource.java:176)
>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> at
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>
>> at
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>
>> at
>> com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:40)
>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> at
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>
>> at
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>
>> at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)
>>
>>
>> Appreciate any insight into this issue.
>>
>> Thanks!
>> Arul
>>
>> package sample;
>>
>> import com.sun.grizzly.http.SelectorThread;
>> import com.sun.jersey.api.client.Client;
>> import com.sun.jersey.api.client.WebResource;
>> import com.sun.jersey.api.container.grizzly.GrizzlyWebContainerFactory;
>> import junit.framework.TestCase;
>>
>> import javax.ws.rs.Consumes;
>> import javax.ws.rs.POST;
>> import javax.ws.rs.Path;
>> import javax.ws.rs.Produces;
>> import javax.ws.rs.core.Context;
>> import javax.ws.rs.core.MediaType;
>> import javax.ws.rs.core.Request;
>> import javax.ws.rs.core.UriBuilder;
>> import javax.ws.rs.core.UriInfo;
>> import javax.xml.bind.annotation.XmlRootElement;
>> import java.io.IOException;
>> import java.net.URI;
>> import java.util.HashMap;
>> import java.util.Map;
>>
>> public class TestSubResource extends TestCase {
>>
>> private SelectorThread threadSelector;
>>
>> private static final String JERSEY_HTTP_TEST_PORT = "9191";
>>
>> protected WebResource r;
>>
>> protected Client c;
>>
>> /**
>> * Get the base URI for the Web application.
>> *
>> * @return the base URI.
>> */
>> private static URI getBaseURI() {
>> return
>> UriBuilder.fromUri("http://localhost/rest").port(getPort(9998)).build();
>> }
>>
>> /**
>> * The base URI of the Web application.
>> */
>> public static final URI BASE_URI = getBaseURI();
>>
>> /**
>> * Get the HTTP port for the Web application.
>> *
>> * @param defaultPort the default HTTP port to use.
>> * @return the HTTP port.
>> */
>> private static int getPort(int defaultPort) {
>> String port = JERSEY_HTTP_TEST_PORT;
>> if (null != port) {
>> try {
>> return Integer.parseInt(port);
>> } catch (NumberFormatException e) {
>> }
>> }
>> return defaultPort;
>> }
>>
>> /**
>> * Start the Grizzly HTTP Container.
>> *
>> * @return SelectorThread the Grizzly selector thread.
>> * @throws java.io.IOException if there is an error starting the
>> Grizzly
>> * HTTP container.
>> */
>> protected static SelectorThread startServer() throws IOException {
>> final Map<String, String> initParams = new HashMap<String, String>();
>>
>> initParams.put("com.sun.jersey.config.property.packages", "sample");
>> System.out.println("Starting grizzly...");
>> return GrizzlyWebContainerFactory.create(BASE_URI, initParams);
>> }
>>
>> public TestSubResource() {
>> }
>>
>> public TestSubResource(String testName) {
>> super(testName);
>> }
>>
>> @Override
>> protected void setUp() throws Exception {
>> super.setUp();
>>
>> //start the Grizzly web container and create the client
>> threadSelector = startServer();
>>
>> c = Client.create();
>> r = c.resource(BASE_URI);
>> }
>>
>> @Override
>> protected void tearDown() throws Exception {
>> super.tearDown();
>>
>> threadSelector.stopEndpoint();
>> }
>>
>>
>> @Path("/customerservice")
>> public static class JerseyResource {
>> @Context
>> UriInfo uriInfo;
>> @Context
>> Request request;
>>
>>
>> public JerseyResource(UriInfo uriInfo, Request request) {
>> this.uriInfo = uriInfo;
>> this.request = request;
>> }
>>
>> @Path("customers")
>> public CustomerResource getCustomerResource(Customer pojo) {
>> return new CustomerResource(uriInfo, request, pojo);
>> }
>>
>> }
>>
>> public static class CustomerResource {
>> @Context
>> UriInfo uriInfo;
>> @Context
>> Request request;
>> Customer customer;
>>
>> public CustomerResource(UriInfo uriInfo, Request request, Customer
>> customer) {
>> this.uriInfo = uriInfo;
>> this.request = request;
>> this.customer = customer;
>> }
>>
>> @POST
>> @Consumes("application/xml")
>> @Produces("application/xml")
>> public Customer addCustomer() {
>> URI uri = uriInfo.getAbsolutePath();
>> customer.setUri(uri.toString());
>> return customer;
>> }
>> }
>>
>> @XmlRootElement
>> static class Customer {
>> private String name;
>> private String uri;
>>
>>
>> public String getName() {
>> return name;
>> }
>>
>> public void setName(String name) {
>> this.name = name;
>> }
>>
>> public String getUri() {
>> return uri;
>> }
>>
>> public void setUri(String uri) {
>> this.uri = uri;
>> }
>> }
>>
>> public void testCustomerSubResource() {
>> Customer pojo = new Customer();
>> pojo.setName("joe");
>>
>> Customer mojo =
>> r.path("customerservice").path("customers").type(MediaType.APPLICATION_XML).post(Customer.class,
>> pojo);
>> assertEquals(pojo.getName(), mojo.getName());
>>
>> }
>> }
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe_at_jersey.dev.java.net
>> For additional commands, e-mail: users-help_at_jersey.dev.java.net
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe_at_jersey.dev.java.net
> For additional commands, e-mail: users-help_at_jersey.dev.java.net
>