{"id":32,"date":"2007-08-24T22:08:51","date_gmt":"2007-08-24T22:08:51","guid":{"rendered":"http:\/\/euve3303.vserver.de\/stefan\/blog\/?p=35"},"modified":"2011-12-02T21:11:36","modified_gmt":"2011-12-02T20:11:36","slug":"spring-elresolver-mit-messagesource-support","status":"publish","type":"post","link":"https:\/\/cogito-ergo-blog.de\/blog\/2007\/08\/24\/spring-elresolver-mit-messagesource-support\/","title":{"rendered":"Spring ELResolver mit MessageSource-Support"},"content":{"rendered":"<h3>Spring ELResolver f\u00fcr Unified Expression Language und JSF 1.2<\/h3>\n<p>\nSeit 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).\n<\/p>\n<p>\nDer vorgestellte ELResolver exponiert den kompletten WebApplicationContext mit allen SpringBeans und kommt dar\u00fcber hinaus noch mit Support f\u00fcr Springs MessageSources, so dass ein Ausdruck <code>#{bundle.key}<\/code> direkt auf die MessageSource zu greifen kann.\n<\/p>\n<p><!--more--><\/p>\n<p>\nDieser ELResolver macht den alten DelegatingVariableResolver von Spring \u00fcberfl\u00fcssig. Inspiriert von Rick Hightowers <a href=\"http:\/\/www.thearcmind.com\/confluence\/display\/SpribernateSF\/Spring+JSF+contribution+Round+1+MessageSourcePropertyResolver\">MessageSourcePropertyResolver<\/a><br \/>\nkann der Resolver direkt auf MessageSources zugreifen und die entsprechende Message zur\u00fcckliefern.\n<\/p>\n<p>In Spring 2.1 ist ein \u00e4hnlicher Resolver auch schon enthalten, allerdings ohne die M\u00f6glichkeit auf MessageSources zuzugreifen.<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n    package org.springframework.web.jsf;\r\n\r\n    import java.beans.FeatureDescriptor;\r\n    import java.util.Iterator;\r\n\r\n    import javax.el.ELContext;\r\n    import javax.el.ELResolver;\r\n    import javax.faces.context.FacesContext;\r\n\r\n    import org.springframework.context.MessageSource;\r\n    import org.springframework.web.context.WebApplicationContext;\r\n\r\n    \/**\r\n    * new style ELResolver for JSF 1.2. Exposes all spring beans to el expressions.\r\n    * has additional support for message sources.\r\n    * @author Stefan Rinke\r\n    *\/\r\n    public class MessageSourceELResolver extends ELResolver {\r\n\r\n      \/**\r\n       * No Arguments to message source.\r\n       *\/\r\n      private static final Object[] NO_ARGS = new Object[] {};\r\n\r\n\r\n      @Override\r\n      public Class&lt;?&gt; getCommonPropertyType(ELContext elContext, Object base) {\r\n        return base instanceof MessageSource ? String.class : Object.class;\r\n      }\r\n\r\n      @Override\r\n      public Iterator&lt;FeatureDescriptor&gt; getFeatureDescriptors(ELContext elContext,\r\n          Object base) {\r\n        return null;\r\n      }\r\n\r\n      @Override\r\n      public Class&lt;?&gt; getType(ELContext ctx, Object base, Object val) {\r\n        if (null != base &amp;&amp; base instanceof MessageSource) {\r\n          ctx.setPropertyResolved(true);\r\n          return String.class;\r\n        }\r\n        return null;\r\n      }\r\n\r\n      @Override\r\n      public Object getValue(ELContext elContext, Object base, Object property) {\r\n        \/\/ If we have a non-null base object, function as a PropertyResolver\r\n        if (base != null) {\r\n          if (base instanceof MessageSource) {\r\n            elContext.setPropertyResolved(true);\r\n            FacesContext context = (FacesContext) elContext.getContext(FacesContext.class);\r\n            return ((MessageSource) base).getMessage((String) property, NO_ARGS,\r\n                context.getViewRoot().getLocale());\r\n          }\r\n        } else {\r\n          \/\/ act as variable resolver\r\n          if( property instanceof String ) {\r\n            FacesContext context = (FacesContext) elContext.getContext(FacesContext.class);\r\n            WebApplicationContext webCtx = FacesContextUtils.getRequiredWebApplicationContext(context);\r\n            if( webCtx.containsBean((String) property) ) {\r\n              elContext.setPropertyResolved(true);\r\n              return webCtx.getBean((String) property);\r\n            }\r\n          }\r\n        }\r\n        return null;\r\n      }\r\n\r\n      @Override\r\n      public boolean isReadOnly(ELContext elContext, Object base, Object property) {\r\n        if( base instanceof MessageSource ) {\r\n          elContext.setPropertyResolved(true);\r\n        }\r\n        return false;\r\n      }\r\n\r\n      @Override\r\n      public void setValue(ELContext arg0, Object arg1, Object arg2, Object arg3) {\r\n      }\r\n\r\n    } \r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Spring ELResolver f\u00fcr 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 &hellip; <a href=\"https:\/\/cogito-ergo-blog.de\/blog\/2007\/08\/24\/spring-elresolver-mit-messagesource-support\/\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[],"_links":{"self":[{"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/posts\/32"}],"collection":[{"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/comments?post=32"}],"version-history":[{"count":2,"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/posts\/32\/revisions"}],"predecessor-version":[{"id":10037,"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/posts\/32\/revisions\/10037"}],"wp:attachment":[{"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/media?parent=32"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/categories?post=32"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/tags?post=32"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}