users@jersey.java.net

Guice provider

From: Christian <christian.rivasseau_at_gmail.com>
Date: Fri, 16 Nov 2007 17:50:42 +0100

Hi jersey users,

Just to let you know, copying Mark hadley's note on spring's jersey
integration (
http://weblogs.java.net/blog/mhadley/archive/2007/09/integrating_jer.html),
I have been able to instantiate ressources services using the guice
framework
(http://code.google.com/p/google-guice/)

Works like a charm so far.



import com.sun.ws.rest.spi.resource.ResourceFactory;
> import java.lang.annotation.Documented ;
> import java.lang.annotation.ElementType;
> import java.lang.annotation.Retention;
> import java.lang.annotation.RetentionPolicy;
> import java.lang.annotation.Target;
>
>
> @Target({ElementType.TYPE})
> @Retention( RetentionPolicy.RUNTIME)
> @Documented
> @ResourceFactory(GuiceProvider.class)
>
> > public @interface GuiceFactory {}
>
>



public class GuiceProvider implements ResourceProvider {

    private Class<?> resourceClass=null;
    private static Injector guiceInjector=null;


    protected static synchronized void
initGuiceInjector(ResourceProviderContext context) {
          if (guiceInjector==null) {
              DummyResource r=new DummyResource();
              context.injectDependencies(r);
              guiceInjector=Guice.createInjector(new NaiadeModule(
r.servletConfig));
         }
    }

    public void init(Class<?> resourceClass, Map<String, Boolean> arg1,
            Map<String, Object> arg2) {
                this.resourceClass = resourceClass;
    }

    public Object getInstance(ResourceProviderContext context) throws
ContainerException {
        initGuiceInjector(context);
        Object resource=null;
        try {
            resource=this.resourceClass.newInstance();
        } catch (InstantiationException ex) {
            throw new ContainerException("Unable to create resource", ex);
        }
      catch (IllegalAccessException ex) {
          throw new ContainerException("Unable to create resource", ex);
      }
        context.injectDependencies(resource);
        guiceInjector.injectMembers(resource);
        return resource;
    }


    public static class DummyResource {
          @Resource
          public ServletConfig servletConfig;
        }

}