Hello, my name is Luke Bunselmeyer. I’m a fun loving Full-Stack engineer who delights in polyglot programming from back-end to front-end, Java to JavaScript, Web services to Web development.

I recently had the opportunity to integrate the Play Framework with a Guice managed Java web app. This presented two main challeges: 1) where to hook-in the Guice Injector and 2) how to support Guice RequestScoped resources. Fortunately, both Play 2.1-RC1 and Guice have several API’s to simplify things. Moreover, I was able to wrap the entire solution into a reusable Play Module, play2-guice-module, which I’ll detail here.

Inspired by Guice’s excellent ServletModule integration, play2-guice-module takes advantage of some of the new Play 2.1 RC1 features to provide several utility classes to integrate Google Guice into Play.

Getting Started

Play 2.1-RC1 provides hooks to create a “dynamic” controller class with each request. In conf/routes simply prefix each controller action with an @.

# Tell Play to create a new controller with each request by prefixing the action with an `@`:
GET     /                           @controllers.Application.index()

Create a Global object which extends GuiceGlobalSettings as illustrated below…

public class Global extends GuiceGlobalSettings {
    protected Injector createInjector() {
        return Guice.createInjector(Stage.PRODUCTION, new PlayModule() {

            protected void configurePlay() {
                // bind some stuff!

Finally, just annotate your controller method with @With(RequestScopedAction.class) to enable @RequestScoped resources.

public class Application extends Controller {

    // ahhh immutable...
    private final FooPresenter _fooPresenter;

    // yeah, constructor injector!
    Application(FooPresenter fooPresenter) {
        _fooPresenter = fooPresenter;

    // Enable RequestScoped resources for this action
    public Result index() {
        String bar = _fooPresenter.getBar();
        return ok(index.render("Request: " + bar));

Available Injections

Installing the PlayModule automatically gives you access to several classes from the Play framework. These classes are injectable in any Guice injected object by default, when you install the PlayModule

public class FooPresenter {

    FooPresenter(Http.Request request, Http.Response response, Http.Context context) {


See the sample-app for more details.