users@jersey.java.net

adding a _at_Context annotated parameter using an InjectableProvider on Websphere

From: Mark Birenbaum <mark.birenbaum_at_BPSResolver.com>
Date: Wed, 25 Aug 2010 12:05:32 -0700

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?