A simple way to Inject Guice into JSF (Mojarra)
Previously I have been using GuiceSF to inject the JSF managed beans which extends the Mojarra's implementation of
In upgrading to newer version of JSF, I had to manually tweak it to keep it in line with the new features in the spec which took a fair amount of debug stepping. So when JSF 2 came out I looked around for a way to do it which still used the implementation's bean creation and handling but also injected it with Guice.
After digging around in the injection code in Mojarra, I saw how simple it would be to extend the provided Tomcat injection (which injects stuff for the @Resource and @EJB etc annotations).
This solution first requires the injection provider be specified in web.xml:
Next extend the Tomcat injector:
ELResolver (ManagedBeanELResolver). This was bit of a hack but it was relatively simple to implement.In upgrading to newer version of JSF, I had to manually tweak it to keep it in line with the new features in the spec which took a fair amount of debug stepping. So when JSF 2 came out I looked around for a way to do it which still used the implementation's bean creation and handling but also injected it with Guice.
After digging around in the injection code in Mojarra, I saw how simple it would be to extend the provided Tomcat injection (which injects stuff for the @Resource and @EJB etc annotations).
This solution first requires the injection provider be specified in web.xml:
<context-param> <description>JSF Injection provider</description> <param-name>com.sun.faces.injectionProvider</param-name> <param-value>net.devgrok.jsf.Tomcat6GuiceInjectionProvider</param-value> </context-param>
Next extend the Tomcat injector:
package net.devgrok.jsf;
import javax.faces.FacesException;
import javax.servlet.ServletContext;
import org.apache.AnnotationProcessor;
import com.google.inject.Injector;
import com.sun.faces.spi.InjectionProviderException;
import com.sun.faces.vendor.Tomcat6InjectionProvider;
/**
* Based on {@link com.sun.faces.vendor.Tomcat6InjectionProvider}. Injects using Guice for JSF.
*
* @author Chris Watts
*/
public class Tomcat6GuiceInjectionProvider extends Tomcat6InjectionProvider
{
private ServletContext servletContext;
public Tomcat6GuiceInjectionProvider(ServletContext servletContext)
{
super(servletContext);
this.servletContext = servletContext;
}
public void inject(Object managedBean) throws InjectionProviderException
{
try
{
getProcessor().processAnnotations(managedBean);
getInjector().injectMembers(managedBean);
}
catch (Exception e)
{
throw new InjectionProviderException(e);
}
}
private AnnotationProcessor getProcessor()
{
return ((AnnotationProcessor) servletContext.getAttribute(AnnotationProcessor.class.getName()));
}
protected Injector getInjector()
{
Injector injector = (Injector) servletContext.getAttribute(Injector.class.getName());
if (injector == null)
throw new FacesException("Guice injector not found, verify your web.xml file for mapping GuiceContextListener");
return injector;
}
}
Comments
Post a Comment