- Assemble framework libraries using Maven.
- Create a POJO interface and an implementation.
- Write a JAX-RS resoure to use Guice constructor injection and JAX-RS annotations.
- Write the Guice bootstrap code.
- Write the embedded Jetty start up code.
- Run and test.
7.4.1.v20110513 1.7 3.0 org.eclipse.jetty jetty-servlet ${jetty.version} com.google.inject guice ${guice.verion} com.sun.jersey jersey-server ${jersey.version} com.sun.jersey.contribs jersey-guice ${jersey.version} junit junit ${junit.version} test maven2-repository.java.net Java.net Repository for Maven http://download.java.net/maven/2/ default
We start with a simple POJO interface:
public interface GuicyInterface { String get(); }And a simple implementation:
public class GuicyInterfaceImpl implements GuicyInterface { public String get() { return GuicyInterfaceImpl.class.getName(); } }Now, write a JAX-RS resource to use both Guice and JAX-RS annotated injections:
import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import com.google.inject.Inject;@Path("/helloguice") public class HelloGuice { private final GuicyInterface gi; @Inject public HelloGuice(final GuicyInterface gi) { this.gi = gi; } @GET @Produces("text/plain") public String get(@QueryParam("x") String x) { return "Howdy Guice. " + "Injected impl " + gi.toString() + ". Injected query parameter "+ (x != null ? "x = " + x : "x is not injected"); } }
Next, compose POJO bindins in a JerseyServletModule. This module will setup the Jersey-based JAX-RS framework for use with Guide injection. The GuiceServletContextListener is used to bootstrap Guice when the servet context is initialized.
import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.servlet.GuiceServletContextListener; import com.sun.jersey.guice.JerseyServletModule; import com.sun.jersey.guice.spi.container.servlet.GuiceContainer; public class HelloGuiceServletConfig extends GuiceServletContextListener { @Override protected Injector getInjector() { return Guice.createInjector(new JerseyServletModule() { @Override protected void configureServlets() { // Must configure at least one JAX-RS resource or the // server will fail to start. bind(HelloGuice.class); bind(GuicyInterface.class).to(GuicyInterfaceImpl.class); // Route all requests through GuiceContainer serve("/*").with(GuiceContainer.class); } }); } }
Finally, write the main method using embedded Jersey to start Guice and Jersey together.
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.DefaultServlet; import org.eclipse.jetty.servlet.ServletContextHandler; import com.google.inject.servlet.GuiceFilter; public class GuiceLauncher { public static void main(String[] args) throws Exception { // Create the server. Server server = new Server(8080); // Create a servlet context and add the jersey servlet. ServletContextHandler sch = new ServletContextHandler(server, "/"); // Add our Guice listener that includes our bindings sch.addEventListener(new HelloGuiceServletConfig()); // Then add GuiceFilter and configure the server to // reroute all requests through this filter. sch.addFilter(GuiceFilter.class, "/*", null); // Must add DefaultServlet for embedded Jetty. // Failing to do this will cause 404 errors. // This is not needed if web.xml is used instead. sch.addServlet(DefaultServlet.class, "/"); // Start the server server.start(); server.join(); } }
If you run the main program on your local host, you can test the servlet using this URL:
http://localhost:8080/helloguice?x=q
Then, you should see a response like this:
Howdy Guice. Injected impl GuicyInterfaceImpl@3aaa3518. Injected query parameter x = qCongratulations! You have now mastered the three most popular IoC frameworks for programming RESTful servlets!