LabsSeamGuice

    JBoss Seam and Google Guice

     

    Usage - @Guice

     

    The rule is fairly simple - if you want to use Guice injection in your Seam component, annotate it with the @org.jboss.labs.seam.guice.Guice annotation.

    @Name("myGuicyComponent")
    @Guice public class MyGuicyComponent
    {
       @Inject MyObject myObject;
       ...
    } 
    

     

    For all Seam components annotated with the @Guice annotation, Guice injection will be performed automatically.

     

    Configuration

     

    To use @Guice annotation in your Seam web application:

     

    1. Add seam-guice.jar and guice-1.0.jar to the lib directory. If you are using seam-gen-erated project, edit build.xml file to inculde those libraries in your war.

     

    2. Configure Guice injector that will be used. To do so, add the following changes to the components.xml file:

     

    <components xmlns="http://jboss.com/products/seam/components" ...
                           xmlns:guice="http://jboss.org/jbosslabs/seam-guice">
       ...
       <guice:init injector="#{myGuiceInjector}"/>
       ...
    </components> 
    

     

    where 'myGuiceInjector' is your injector (a Seam component that implements com.google.inject.Injector).

     

    Configuration steps for the Seam ear application should be quite similar.

     

    Creating Injector

     

    Since injector is defined with EL expression, you can obtain it in whatever way you like. You can use an injector that is already used in other, non-Seam parts of you application. You may use Seam factory component pattern to provide injector:

     

    @Name("myGuiceInjectorFactory")
    public InjectorFactory
    {
       @Factory(name="myGuiceInjector", scope=APPLICATION, create=true)
       public Injector getInjector()
       {
          // Your code that returns injector    
       }
    } 

     

    On the other hand, if you would like to create a new injector from a list of modules, we provide a convenient way to do this:

    <guice:injector name="myGuiceInjector">
            <guice:modules>
               <value>com.example.guice.GuiceModule1</value>
               <value>com.example.guice.GuiceModule2</value>
            </guice:modules>
    </guice:injector>
    

     

    Multiple Injectors

     

    By default, an injector configured in the configuration.xml file is used, but if you really need to use multiple injectors (AFAIK, you should use multiple modules instead), you can specify different injector for every Seam component:

     

    @Name("myGuicyComponent")
    @Guice("myGuiceInjector")
    public class MyGuicyComponent
    {
       @Inject MyObject myObject;
       ...
    } 
    

     

    FAQ

     

    • Q: I got java.lang.ClassNotFoundException: No ClassLoaders found for: com.example.MyModule exception.

    • A: This happens when you reference hot deployed class from the components.xml file. Make sure that your Guice  class is not in the WEB-INF/dev direcotry.

     

    • Q: I got NPE on the filed annotated with @Inject

    • A: Make sure seam-guice.jar is in the WEB-INF/lib directory of your war.

     

    Feedback

     

    This is one of the first versions of the library so let me know in case you find a bug. Your feedback is much appreciated. I usually watch Seam Forum or you can contact me (pawel . wrzeszcz [at] gmail . com) directly.

     

    Acknowledgment

     

    Many thanks to Tomek for making me Guice addict

     

    Downloads and Sources

     

    You can download the seam-guice.jar here: http://www.jboss.org/shotoku/downloads/other.

     

    Source code is available in the JBoss Labs repository.

     

    XML Schema for configuraion: http://www.jboss.org/file-access/default/members/jbosslabs/freezone/seam-guice/guice-2.1.xsd

     

    Seam and Guice integration is also available as a patch to JBoss Seam project. You can vote to make it part of the Seam

     

    Other projects integrating Guice

     

    Blog entry on Seam and Guice integration

     

    The library has been tested with JBoss Seam 2.1.0.A1.