users@jersey.java.net

SubResource locators and _at_Context injection...

From: Rabick, Mark A (MS) <"Rabick,>
Date: Fri, 27 Feb 2009 15:13:03 -0600

I've got a resource base class that injects the @Context information:

import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.SecurityContext;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.ext.Providers;

public class BaseResource {

        @Context
        protected SecurityContext securityContext;
        @Context
        protected UriInfo uriInfo;
        @Context
        protected Request request;
        @Context
        protected HttpHeaders httpHeaders;
        @Context
        protected Providers providers;

        public BaseResource() {
                super();
        }

}

If I have a resource with a sub-resource locator:

@Path("/")
public class NodesResource extends BaseResource {

        @EJB private NodeRemote nodeRemote;

        @Path("/v1/nodes")
        public NodesV1Resource getNodesV1Resource() {
                System.out.println("uriInfo: " +
uriInfo.getMatchedURIs().toString());
                System.out.println("uriInfo: " +
uriInfo.getMatchedResources().toString());
                return new NodesV1Resource(nodeRemote);
        }
}

The System.out-s display the expected output. The sub-resource class
is:

public class NodesV1Resource extends BaseResource {

        private NodeRemote nodeRemote;
        
        public NodesV1Resource(NodeRemote nodeRemote) {
                this.nodeRemote = nodeRemote;
        }
        
        @GET @Path("{sk}")
        
@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
        public NodeV1 getNodeV1ByKey(@PathParam("sk") String sk) {
                
                System.out.println("uriInfo: " +
uriInfo.getMatchedURIs().toString());
                System.out.println("uriInfo: " +
uriInfo.getMatchedResources().toString());
                
                Node node = nodeRemote.getBySk(sk);
                
                if (node == null)
                        throw new NotFoundException("Node not found for
sk: " + sk);
                
                NodeV1 nodeV1 = (new BuilderV1()).buildNodeV1(node);

                return nodeV1;
        }

I get NullPointerException-s on the System.out calls in getNodeV1ByKey.
It doesn't appear to inject the UriInfo and other @Context annotated
elements in the BaseResource if the method is in a sub-resource. I can
inject the specific @Context in the method:

        public NodeV1 getNodeV1ByKey(@Context UriInfo uriInfo,
                        @PathParam("sk") String sk) {...}

Another point, I have to pass the EJB remote interface from the
NodesResource base resource in the constructor of the NodesV1Resource.
It doesn't inject the @EJB in a sub-resource either. Is this spec
behavior? Does injection (either @Context or InjectableProvider) only
occur on base resource classes or in parameters to subresource methods?

--mark
_______________________________________________
Mark A. Rabick
Software Engineer
Northrop Grumman - C2 Systems (MS/C2SD/IIS)
3200 Samson Way
Bellevue, NE 68123
Ph: (402) 293-7091
Em: mark.rabick_at_ngc.com
Remember PFC Ross A. McGinnis...
  http://www.army.mil/medalofhonor/McGinnis/index.html
... MA2 Michael A. Monsoor, Lt. Michael P. Murphy, Cpl. Jason Dunham,
SFC Paul Ray Smith and the rest...
  http://www.cmohs.org/recipients/most_recent.htm