This example demonstrates how to develop Restful WebService sample using Guice Servlet Extensions with a servlet filter.
    <listener>
        <listener-class>com.sun.jersey.samples.guice.GuiceServletConfig</listener-class>
    </listener>
       
        GuiceServletConfig is class that extends GuiceServletContextListener and overrides the getInjector() method to return a Guice injector which has it's configureServlets method overridden to filter all request "/*".
       
       Next, place GuiceFilter after this </listener>  element in your .web.xml file:
       
    <filter>
        <filter-name>guiceFilter</filter-name>
        <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>guiceFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
       
This tells the Servlet Container to re-route all requests through GuiceFilter.
GuiceServletConfig.java file by overriding getInjector() to return our new instance of ServletModule:
@Override
protected Injector getInjector() {
        return Guice.createInjector(new ServletModule() {
You can think of the ServletModule as an in-code replacement for the web.xml deployment descriptor.  
@Override
protected void configureServlets() {
    // Bind classes
    bind(PerRequestResource.class);
    serve("/*").with(GuiceContainer.class);
  }
});
 The module also provides a place to configure your filters and servlets from. 
 We have chosen to create the injector in our ServletContextListener.
 (Feel free to create the injector from any place you choose).
 A ServletContextListener is a Java servlet component that is triggered as soon
 as a web application is deployed, and before any requests begin to arrive.
 Guice Servlet provides a convenience utility that you can subclass in order
 to register your own ServletContextListeners:
public class GuiceServletConfig extends GuiceServletContextListener {
@Override
    protected Injector getInjector() {
        return Guice.createInjector(new ServletModule() {
The final class looks like this:
public class GuiceServletConfig extends GuiceServletContextListener {
    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new ServletModule() {
            @Override
            protected void configureServlets() {
                // Bind classes
                bind(PerRequestResource.class);
                serve("/*").with(GuiceContainer.class);
            }
        });
    }
}
PerRequestResource which binds path @Path("bound/perrequest") to scope using guice @RequestScoped as shown in the following code:
//Create resource class, @Path("bound/perrequest"), using guice @RequestScoped
@Path("bound/perrequest")
@RequestScoped
public class PerRequestResource {
//Inject URI info and a query parameter
@Context UriInfo ui;
@QueryParam("x") String x;
SingletonComponent.java) and inject into resource PerRequestResource at construction time via code:
private final SingletonComponent sc;
    //Create singleton component and inject into resource at construction
    @Inject
    public PerRequestResource(SingletonComponent sc) {
        this.sc = sc;
    }
The mapping of the URI path space is presented in the following table:
| URI path | Resource class | HTTP method | Description | 
|---|---|---|---|
| /jersey-guice-filter/bound/perrequest | PerRequestResource | GET | Returns string representing PerRequestResource Context URI info path along with QueryParam and Singleton component's hashcode integer value converted to hex, prefixed by SINGLETON: | 
You can run the example using embedded GlassFish as follows:
Build and deploy the project by executing maven from the project directory
mvn clean package embedded-glassfish:runFrom a web browser, visit:
http://localhost:8080/jersey-guice-filter/bound/perrequest