users@jersey.java.net

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

From: Craig McClanahan <Craig.McClanahan_at_Sun.COM>
Date: Mon, 23 Mar 2009 19:48:31 -0700

Ian Clarke wrote:
> Thanks for that.
>
> Can you point me to a simple example of using the Injectable annotations?
One example is in the contribs/jersey-multipart project, where I wanted
to be able to inject an instance of
"com.sun.jersey.multipart.MultiPartConfig" into my resource classes. I
wrote a provider for this in class
"com.sun.jersey.multipart.impl.MultiPartConfigProvider" and configured
it with a
"src/main/java/META-INF/services/com.sun.jersey.multipart.impl.MultiPartImplProvider"
file that has to end up in META-INF/services in your WEB-INF/classes
directory or inside a jar in WEB-INF/lib.

This lets me inject resources (using @Context, as you correctly
surmised) into classes like com.sun.jersey.multipart.impl.MultiPartReader.

In my case, I declared that MultiPartConfig was a singleton, and created
it in the getInjectable() method (which will only get called once
because of the scope value).

For dealing with JDBC, here's what I would suggest:

* Configure a JDBC DataSource in the JNDI environment for your application.

* In the getInjectable() method of your provider, do a JNDI lookup to
get the
  DataSource instance.

* Make the class of the injected object have a getDataSource() method on it
  that returns this data source instance.

* In a resource method that received the injected object, have it call
  getDataSource().getConnection() on the injected object to get a
connection,
  and then call connection.close() when you are through to return that
connection
  to the data source's pool. Be sure you do this close even if an exception
  gets thrown along the way.

The last step ensures that you won't have two (or more) simultaneous
requests fighting over the same JDBC Connection instance, which is not
allowed.

Craig
>
> Ian.
>
> On Mon, Mar 23, 2009 at 7:19 PM, Erdinc Yilmazel <erdinc_at_yilmazel.com
> <mailto:erdinc_at_yilmazel.com>> wrote:
>
> Hi,
>
> You may write your own Injectables and InjectableProviders for
> injecting custom objects. You may even define your own annotations for
> that. See :
>
> com.sun.jersey.spi.inject.Injectable
> com.sun.jersey.spi.inject.InjectableProvider
> com.sun.jersey.spi.inject.Inject
>
> After writing and InjectableProvider you must annotate it with
> @Provider annotation to make Jersey aware of that class.
>
> The @Context annotation has also its InjectableProvider.
>
> The other choice is using a IOC framework like google guice. Support
> for google guice may be bundled with the upcoming 1.0.3 version of
> Jersey, but you can find an example code in jersey subversion
> repository.
>
> Erdinc
>
> On Mon, Mar 23, 2009 at 11:33 PM, Ian Clarke <ian.clarke_at_gmail.com
> <mailto:ian.clarke_at_gmail.com>> wrote:
> > I have an object, lets say a SQL connection, that I want my
> Jersey resource
> > classes to have access to, but I don't want to make the SQL
> connection
> > static (because some day there may be more than one of them).
> >
> > How do I inject an object like this into a resource class so
> that it can use
> > it? For that matter, how do I tell resource classes about any
> objects
> > without making them available statically?
> >
> > I have a feeling it may be something to do with the @Context
> annotation, but
> > I haven't been able to find clear documentation on this.
> >
> > Any help would be appreciated,
> >
> > Ian.
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe_at_jersey.dev.java.net
> <mailto:users-unsubscribe_at_jersey.dev.java.net>
> For additional commands, e-mail: users-help_at_jersey.dev.java.net
> <mailto:users-help_at_jersey.dev.java.net>
>
>
>
>
> --
> Ian Clarke
> CEO, Uprizer Labs
> Email: ian_at_uprizer.com <mailto:ian_at_uprizer.com>
> Ph: +1 512 422 3588
> Fax: +1 512 276 6674