Adding Web Beans JSR 299 to Jersey for REST

While playing with Web Beans I thought it would be nice to add Web Beans support to Jersey. Jersey is a JSR 311 implementation for RESTful web services in Java. Though it has taken some flak, I - and others - think it's easy to use. Because it's easy in Jersey to control the creation of objects by writing your own servlet with a Jersey ComponentProvider, I finished a quick hack in no time. Some help was the integration examples for Spring.

public class WebbeansJerseyServlet extends ServletContainer {

  private static class WebbeansComponentProvider 
    implements ComponentProvider {
    
    private WebBeansContainer webBeans = WebBeansContainer.create();

    public Object getInstance(ComponentProvider.Scope scope, Class c)
      throws InstantiationException, IllegalAccessException {
      return webBeans.getObject(c);
    }

    public Object getInstance(Scope scope, Constructor contructor,
                              Object[] parameters)
      throws InstantiationException, IllegalArgumentException,
      IllegalAccessException, InvocationTargetException {
      return null;
    }

    public void inject(Object instance) { }
  }

  protected void initiate(ResourceConfig rc, WebApplication wa) {
    wa.initiate(rc, new WebbeansComponentProvider());
  }
}

Having defined this servlet, a REST resource example for the UuidService from my last post about Web Beans, looks like this

@Path("/uuid")
public class UuidResource {
  @Named("uuid")
  UUIDService service;

  public UuidResource() {
  }

  @GET
  @ProduceMime("text/plain")
  public String getUuuid() {
    return service.getValue();
  }
}

Works like a charm. The UUIDService is injected through Web Beans and the scopes from Web Beans, @RequestScope and @SessionScope seem to work. This takes a big burden from the developer.

I hope to implement a SOFEA web application with Javascript parts which communicate with the backend via REST. For performance reasons it would be nice to populate and render the Javascript on the server. Therefore I would wish I could resolve REST calls to Jersey internally like

jersey.get("/helloworld/3");

to pre-populate pages with REST calls in them.

Thanks for listening.

Update:The Jersey lead wrote about a Jersey client API which perhaps does what I want. Splendid.