org.springframework.web.jsf
Class DelegatingVariableResolver

java.lang.Object
  extended by javax.faces.el.VariableResolver
      extended by org.springframework.web.jsf.DelegatingVariableResolver
Direct Known Subclasses:
SpringBeanVariableResolver

public class DelegatingVariableResolver
extends javax.faces.el.VariableResolver

JSF 1.1 VariableResolver that first delegates to the original resolver of the underlying JSF implementation (for resolving managed-bean objects as defined in faces-config.xml as well as well-known implicit EL attributes), then to the Spring root WebApplicationContext (for resolving Spring beans).

Configure this resolver in your faces-config.xml file as follows:

 <application>
   ...
   <variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver</variable-resolver>
 </application>
All your JSF expressions can then implicitly refer to the names of Spring-managed service layer beans, for example in property values of JSF-managed beans:
 <managed-bean>
   <managed-bean-name>myJsfManagedBean</managed-bean-name>
   <managed-bean-class>example.MyJsfManagedBean</managed-bean-class>
   <managed-bean-scope>session</managed-bean-scope>
   <managed-property>
     <property-name>mySpringManagedBusinessObject</property-name>
     <value>#{mySpringManagedBusinessObject}</value>
   </managed-property>
 </managed-bean>
with "mySpringManagedBusinessObject" defined as Spring bean in applicationContext.xml:
 <bean id="mySpringManagedBusinessObject" class="example.MySpringManagedBusinessObject">
   ...
 </bean>

Since:
1.1
Author:
Juergen Hoeller
See Also:
WebApplicationContextVariableResolver, FacesContextUtils.getRequiredWebApplicationContext(javax.faces.context.FacesContext)

Field Summary
protected  Log logger
          Logger available to subclasses
protected  javax.faces.el.VariableResolver originalVariableResolver
           
 
Constructor Summary
DelegatingVariableResolver(javax.faces.el.VariableResolver originalVariableResolver)
          Create a new DelegatingVariableResolver, using the given original VariableResolver.
 
Method Summary
protected  BeanFactory getBeanFactory(javax.faces.context.FacesContext facesContext)
          Retrieve the Spring BeanFactory to delegate bean name resolution to.
protected  javax.faces.el.VariableResolver getOriginalVariableResolver()
          Return the original JSF VariableResolver that this resolver delegates to.
protected  WebApplicationContext getWebApplicationContext(javax.faces.context.FacesContext facesContext)
          Retrieve the web application context to delegate bean name resolution to.
protected  Object resolveOriginal(javax.faces.context.FacesContext facesContext, String name)
          Resolve the attribute via the original JSF VariableResolver.
protected  Object resolveSpringBean(javax.faces.context.FacesContext facesContext, String name)
          Resolve the attribute as a Spring bean in the ApplicationContext.
 Object resolveVariable(javax.faces.context.FacesContext facesContext, String name)
          Delegate to the original VariableResolver first, then try to resolve the variable as Spring bean in the root WebApplicationContext.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

logger

protected final Log logger
Logger available to subclasses


originalVariableResolver

protected final javax.faces.el.VariableResolver originalVariableResolver
Constructor Detail

DelegatingVariableResolver

public DelegatingVariableResolver(javax.faces.el.VariableResolver originalVariableResolver)
Create a new DelegatingVariableResolver, using the given original VariableResolver.

A JSF implementation will automatically pass its original resolver into the constructor of a configured resolver, provided that there is a corresponding constructor argument.

Parameters:
originalVariableResolver - the original VariableResolver
Method Detail

getOriginalVariableResolver

protected final javax.faces.el.VariableResolver getOriginalVariableResolver()
Return the original JSF VariableResolver that this resolver delegates to. Used to resolve standard JSF-managed beans.


resolveVariable

public Object resolveVariable(javax.faces.context.FacesContext facesContext,
                              String name)
                       throws javax.faces.el.EvaluationException
Delegate to the original VariableResolver first, then try to resolve the variable as Spring bean in the root WebApplicationContext.

Specified by:
resolveVariable in class javax.faces.el.VariableResolver
Throws:
javax.faces.el.EvaluationException

resolveOriginal

protected Object resolveOriginal(javax.faces.context.FacesContext facesContext,
                                 String name)
Resolve the attribute via the original JSF VariableResolver.


resolveSpringBean

protected Object resolveSpringBean(javax.faces.context.FacesContext facesContext,
                                   String name)
Resolve the attribute as a Spring bean in the ApplicationContext.


getBeanFactory

protected BeanFactory getBeanFactory(javax.faces.context.FacesContext facesContext)
Retrieve the Spring BeanFactory to delegate bean name resolution to.

The default implementation delegates to getWebApplicationContext. Can be overridden to provide an arbitrary BeanFactory reference to resolve against; usually, this will be a full Spring ApplicationContext.

Parameters:
facesContext - the current JSF context
Returns:
the Spring BeanFactory (never null)
See Also:
getWebApplicationContext(javax.faces.context.FacesContext)

getWebApplicationContext

protected WebApplicationContext getWebApplicationContext(javax.faces.context.FacesContext facesContext)
Retrieve the web application context to delegate bean name resolution to.

The default implementation delegates to FacesContextUtils.

Parameters:
facesContext - the current JSF context
Returns:
the Spring web application context (never null)
See Also:
FacesContextUtils.getRequiredWebApplicationContext(javax.faces.context.FacesContext)