users@jersey.java.net

Re: [Jersey] Newbie question: How do I inject objects into resources

From: Paul Sandoz <Paul.Sandoz_at_Sun.COM>
Date: Tue, 24 Mar 2009 15:12:09 +0100

On Mar 24, 2009, at 2:48 PM, Ian Clarke wrote:

> On Tue, Mar 24, 2009 at 8:44 AM, Paul Sandoz <Paul.Sandoz_at_sun.com>
> wrote:
> See here for some more details on injection:
>
> http://wikis.sun.com/display/Jersey/Overview+of+JAX-RS+1.0+Features#OverviewofJAX-RS1.0Features-RulesofInjection
>
> Thanks Paul, ok - I think I understand how to retrieve the
> ServletContext (and then retrieve objects from this using
> ServletContext.getAttribute() ), however how do I put objects into it?
>
> Here is how I'm setting up the server:
>
> final Map<String, String> initParams = new HashMap<String,
> String>();
>
>
> initParams.put("com.sun.jersey.config.property.resourceConfigClass",
> "com.sun.jersey.api.core.PackagesResourceConfig");
> initParams.put("com.sun.jersey.config.property.packages",
> "com.uprizer.sensearray.io.net.resources");
>
> log.info("Starting Sensearray Server...");
> return GrizzlyWebContainerFactory.create(baseUri, initParams);
>
> Given this, how do I access the ServletContext so that I can add the
> attributes I need to it?
>

To do that independently of Jersey you can create a servlet context
listener.

For Grizzly you would need to use more of the Grizzly APIs rather than
the helper methods provided by Jersey:

   https://grizzly.dev.java.net/nonav/apidocs/com/sun/grizzly/http/embed/GrizzlyWebServer.html
   https://grizzly.dev.java.net/nonav/apidocs/com/sun/grizzly/http/servlet/ServletAdapter.html

         GrizzlyWebServer ws = new GrizzlyWebServer(port);
         ServletAdapter sa = new ServletAdapter();
         sa.setServletInstance(ServletConfig.class.newInstance());
         sa.addServletListener("foo.ContextLoaderListener");
         sa.addInitParameter( PackagesResourceConfig.PROPERTY_PACKAGES,
                  "com.sun.jersey.spring.jerseymanaged" );
         sa.setServletPath(servletPath);
         ws.addGrizzlyAdapter(sa);
         ws.start();


That said i think we can improve things with Jersey to get a pre-
configured ServerAdapter you can modify.


Alternatively you can override the Jersey ServletContainer:

     public class MyServlet extends ServletContainer {

         protected void configure(final ServletConfig sc,
ResourceConfig rc, WebApplication wa) {
             super(sc, rc, wa);
             // ...
         }

And then do:

   return GrizzlyWebContainerFactory.create(baseUri, MyServlet.class,
initParams);

Paul.