{"id":33,"date":"2007-08-25T07:37:00","date_gmt":"2007-08-25T07:37:00","guid":{"rendered":"http:\/\/euve3303.vserver.de\/stefan\/blog\/?p=36"},"modified":"2011-12-02T21:09:55","modified_gmt":"2011-12-02T20:09:55","slug":"elresolver-konfigurieren-mit-spring","status":"publish","type":"post","link":"https:\/\/cogito-ergo-blog.de\/blog\/2007\/08\/25\/elresolver-konfigurieren-mit-spring\/","title":{"rendered":"ELResolver konfigurieren mit Spring"},"content":{"rendered":"<h3>SpringELResolverSupport konfiguriert ELResolver mit Spring<\/h3>\n<p>\nDie \u00dcberschrift sagt eigentlich schon alles: der ELResolver wird selbst durch Spring erzeugt und konfiguriert.\n<\/p>\n<p>Manchmal ist es n\u00fctzlich oder sogar notwendig, dass ein ELResolver durch Spring konfiguriert wird. Wenn man den Resolver allerdings direkt in die faces-config.xml eintr\u00e4gt, dann geht das nicht.\n<\/p>\n<p>\nStattdessen wird ein Helper eingetragen, der auf die eigentlichen ELResolver delegiert&#8230;\n<\/p>\n<p><!--more--><\/p>\n<p>\nDer Quellcode sieht so aus:<\/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    import java.util.Map;\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.ApplicationContext;\r\n\r\n    \/**\r\n    * adds all ELResolvers defined in spring's root context.\r\n    * @author Stefan Rinke\r\n    *\/\r\n    public class SpringELResolverSupport extends ELResolver {\r\n     \r\n      Map&lt;ELResolver,ELResolver&gt; resolvers = null;\r\n\r\n      @SuppressWarnings(&quot;unchecked&quot;)\r\n      private void initResolvers(ELContext ctx) {\r\n        FacesContext context = (FacesContext) ctx.getContext(FacesContext.class);\r\n        if( context != null ) {\r\n          ApplicationContext appCtx = FacesContextUtils.getRequiredWebApplicationContext(context);\r\n          resolvers = appCtx.getBeansOfType(ELResolver.class);\r\n        }\r\n      }\r\n     \r\n      @Override\r\n      public Class&lt;?&gt; getCommonPropertyType(ELContext ctx, Object base) {\r\n        if( resolvers == null ) initResolvers(ctx);\r\n        return Object.class;\r\n      }\r\n\r\n\r\n      @Override\r\n      public Iterator&lt;FeatureDescriptor&gt; getFeatureDescriptors(ELContext arg0, Object arg1) {\r\n        return null;\r\n      }\r\n\r\n      @Override\r\n      public Class&lt;?&gt; getType(ELContext ctx, Object base, Object prop) {\r\n        if( resolvers == null ) initResolvers(ctx);\r\n        for (ELResolver resolver : resolvers.keySet()) {\r\n          Class&lt;?&gt; clz = resolver.getType(ctx, base, prop);\r\n          if( ctx.isPropertyResolved() ) return clz;\r\n        }\r\n        return null;\r\n      }\r\n\r\n      @Override\r\n      public Object getValue(ELContext ctx, Object base, Object prop) {\r\n        if( resolvers == null ) initResolvers(ctx);\r\n        for (ELResolver resolver : resolvers.keySet()) {\r\n          Object value = resolver.getValue(ctx, base, prop);\r\n          if( ctx.isPropertyResolved() ) return value;\r\n        }\r\n        return null;\r\n      }\r\n\r\n      @Override\r\n      public boolean isReadOnly(ELContext ctx, Object base, Object prop) {\r\n        if( resolvers == null ) initResolvers(ctx);\r\n        for (ELResolver resolver : resolvers.keySet()) {\r\n          boolean readOnly = resolver.isReadOnly(ctx, base, prop);\r\n          if( ctx.isPropertyResolved() ) return readOnly;\r\n        }\r\n        return false;\r\n      }\r\n\r\n      @Override\r\n      public void setValue(ELContext ctx, Object base, Object prop, Object value) {\r\n        if( resolvers == null ) initResolvers(ctx);\r\n        for (ELResolver resolver : resolvers.keySet()) {\r\n          resolver.setValue(ctx, base, prop, value);\r\n          if( ctx.isPropertyResolved() ) break;\r\n        }\r\n      }\r\n\r\n    } \r\n<\/pre>\n<\/p>\n<p>\nWas passiert ist einfach zu sagen: Die SpringELResolverSupport-Klasse l\u00e4dt aus dem ApplicationContext von Spring alle ELResolver (mit <i>getBeansOfType(ELResolver.class)<\/i>) und delegiert alle Calls der Reihe nach an die gefundenen Resolver. So kann ein Resolver selbst mit Spring erzeugt und konfiguriert werden.\n<\/p>\n<p>\nOffen bleibt die Frage nach der Reihenfolge. Da getBeansOfType die Reihenfolge offen l\u00e4\u00dft, werden die Resolver beliebig nacheinander aufgerufen. Das kann unter Umst\u00e4nden ein Problem erzeugen, wenn man auf eine ganz bestimmte Reihenfolge angewiesen ist.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>SpringELResolverSupport konfiguriert ELResolver mit Spring Die \u00dcberschrift sagt eigentlich schon alles: der ELResolver wird selbst durch Spring erzeugt und konfiguriert. Manchmal ist es n\u00fctzlich oder sogar notwendig, dass ein ELResolver durch Spring konfiguriert wird. Wenn man den Resolver allerdings direkt &hellip; <a href=\"https:\/\/cogito-ergo-blog.de\/blog\/2007\/08\/25\/elresolver-konfigurieren-mit-spring\/\">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\/33"}],"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=33"}],"version-history":[{"count":2,"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/posts\/33\/revisions"}],"predecessor-version":[{"id":10035,"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/posts\/33\/revisions\/10035"}],"wp:attachment":[{"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/media?parent=33"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/categories?post=33"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/tags?post=33"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}