Spring ELResolver mit MessageSource-Support

Spring ELResolver für Unified Expression Language und JSF 1.2

Seit der Version 1.2 von Java Server Faces sind die alten PropertyResolver und VariableResolver deprecated. Stattdessen sollte man einen ELResolver verwenden. Das hat ausserdem den Vorteil, dass ein ELResolver auch ausserhalb von JSF funktioniert (ab JSP 2.1).

Der vorgestellte ELResolver exponiert den kompletten WebApplicationContext mit allen SpringBeans und kommt darüber hinaus noch mit Support für Springs MessageSources, so dass ein Ausdruck #{bundle.key} direkt auf die MessageSource zu greifen kann.

Dieser ELResolver macht den alten DelegatingVariableResolver von Spring überflüssig. Inspiriert von Rick Hightowers MessageSourcePropertyResolver
kann der Resolver direkt auf MessageSources zugreifen und die entsprechende Message zurückliefern.

In Spring 2.1 ist ein ähnlicher Resolver auch schon enthalten, allerdings ohne die Möglichkeit auf MessageSources zuzugreifen.

    package org.springframework.web.jsf;

    import java.beans.FeatureDescriptor;
    import java.util.Iterator;

    import javax.el.ELContext;
    import javax.el.ELResolver;
    import javax.faces.context.FacesContext;

    import org.springframework.context.MessageSource;
    import org.springframework.web.context.WebApplicationContext;

    /**
    * new style ELResolver for JSF 1.2. Exposes all spring beans to el expressions.
    * has additional support for message sources.
    * @author Stefan Rinke
    */
    public class MessageSourceELResolver extends ELResolver {

      /**
       * No Arguments to message source.
       */
      private static final Object[] NO_ARGS = new Object[] {};


      @Override
      public Class<?> getCommonPropertyType(ELContext elContext, Object base) {
        return base instanceof MessageSource ? String.class : Object.class;
      }

      @Override
      public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext elContext,
          Object base) {
        return null;
      }

      @Override
      public Class<?> getType(ELContext ctx, Object base, Object val) {
        if (null != base && base instanceof MessageSource) {
          ctx.setPropertyResolved(true);
          return String.class;
        }
        return null;
      }

      @Override
      public Object getValue(ELContext elContext, Object base, Object property) {
        // If we have a non-null base object, function as a PropertyResolver
        if (base != null) {
          if (base instanceof MessageSource) {
            elContext.setPropertyResolved(true);
            FacesContext context = (FacesContext) elContext.getContext(FacesContext.class);
            return ((MessageSource) base).getMessage((String) property, NO_ARGS,
                context.getViewRoot().getLocale());
          }
        } else {
          // act as variable resolver
          if( property instanceof String ) {
            FacesContext context = (FacesContext) elContext.getContext(FacesContext.class);
            WebApplicationContext webCtx = FacesContextUtils.getRequiredWebApplicationContext(context);
            if( webCtx.containsBean((String) property) ) {
              elContext.setPropertyResolved(true);
              return webCtx.getBean((String) property);
            }
          }
        }
        return null;
      }

      @Override
      public boolean isReadOnly(ELContext elContext, Object base, Object property) {
        if( base instanceof MessageSource ) {
          elContext.setPropertyResolved(true);
        }
        return false;
      }

      @Override
      public void setValue(ELContext arg0, Object arg1, Object arg2, Object arg3) {
      }

    } 
Dieser Beitrag wurde unter Java veröffentlicht. Setze ein Lesezeichen auf den Permalink.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>