users@jersey.java.net

adding a _at_Context annotated parameter using an InjectableProvider on Websphere

From: Mark Birenbaum <mark_at_birenbaum.net>
Date: Wed, 25 Aug 2010 16:47:43 -0400

We’ve added an InjectableProvider to our system to allow the addition
of Locale to resource methods. Our provider looks like this:



public class LocaleProvider
                implements InjectableProvider<Context, Type> {

...
        public Injectable<Locale> getInjectable(ComponentContext ic, Context
a, Type c) { ...


And our use of it looks like this:

        @GET
        @Produces(APPLICATION_JSON)
        public JSONArray getTasksAsJsonArray(@Context UriInfo uriInfo,
                        @QueryParam("template") boolean isTemplate, @Context Locale locale)
throws JSONException { ...




Works great in tomcat. Blows up in websphere like this:

Exception:
com.sun.jersey.api.container.ContainerException: Method, public
javax.ws.rs.core.Response
com.bps.iproject.jersey.resources.TasksResource. getTasksAsJsonArray
(javax.ws.rs.core.UriInfo,boolean,java.util.Locale), annotated with
GET of resource, class
com.bps.iproject.jersey.resources.TasksResource, is not recognized as
valid Java method annotated with @HttpMethod.
        at com.sun.jersey.server.impl.model.method.ResourceHttpMethod.<init>(ResourceHttpMethod.java:92)
        at com.sun.jersey.server.impl.model.method.ResourceHttpMethod.<init>(ResourceHttpMethod.java:69)
        at com.sun.jersey.server.impl.model.ResourceClass.processSubResourceMethods(ResourceClass.java:258)
        at com.sun.jersey.server.impl.model.ResourceClass.<init>(ResourceClass.java:128)
        at com.sun.jersey.server.impl.application.WebApplicationImpl.newResourceClass(WebApplicationImpl.java:348)
        at com.sun.jersey.server.impl.application.WebApplicationImpl.getResourceClass(WebApplicationImpl.java:321)
        at com.sun.jersey.server.impl.application.WebApplicationImpl.processRootResources(WebApplicationImpl.java:807)
        at com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:590)
        at com.sun.jersey.spi.spring.container.servlet.SpringServlet.initiate(SpringServlet.java:78)
        at com.sun.jersey.spi.container.servlet.ServletContainer$InternalWebComponent.initiate(ServletContainer.java:242)
        at com.sun.jersey.spi.container.servlet.WebComponent.load(WebComponent.java:449)
        at com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:169)
        at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:281)
        at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:442)
        at javax.servlet.GenericServlet.init(GenericServlet.java:256)
        at com.ibm.ws.webcontainer.servlet.ServletWrapper.init(ServletWrapper.java:227)



If I change the Locale to one of the standard @Context options (i.e.,
HttpServletRequest) I have no issues. So to work around this I'm
changing all our methods that take Locale to take the request instead.
 But I would like to know what I'm doing wrong,.

We're using spring and Jersey 1.0.3.

Any thoughts?