hi, i've found a different solution. if the found base object is an instance of CompositeComponentExpressionHolder, we have to create a new ValueExpression based on the found base object and the found property. this new ValueExpression is used to inspect the target (again).
@leonardo: it would be great if you have time to check the solution in combination with myfaces-core2. regards, gerhard http://www.irian.at Your JSF powerhouse - JSF Consulting, Development and Courses in English and German Professional Support for Apache MyFaces 2010/6/30 Leonardo Uribe <[email protected]> > Hi > > Thanks for the demo, it helps a lot. I tried th with myfaces and it throws > the same exception: > > javax.faces.FacesException: java.lang.NullPointerException: name can not be > null > at > org.apache.myfaces.shared_impl.context.ExceptionHandlerImpl.wrap(ExceptionHandlerImpl.java:241) > > at > org.apache.myfaces.shared_impl.context.ExceptionHandlerImpl.handle(ExceptionHandlerImpl.java:156) > at > org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:169) > at > org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:96) > > at javax.faces.webapp.FacesServlet.service(FacesServlet.java:189) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) > > at > org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) > at > org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) > at > org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) > > at > org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) > at > org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) > at > org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) > > at > org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) > at > org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) > at > org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) > > at java.lang.Thread.run(Thread.java:619) > Caused by: java.lang.NullPointerException: name can not be null > at > javax.faces.component.UIComponent.getValueExpression(UIComponent.java:543) > at > org.apache.myfaces.el.unified.resolver.CompositeComponentELResolver$CompositeComponentAttributesMapWrapper.getExpression(CompositeComponentELResolver.java:208) > > at > org.apache.myfaces.extensions.validator.core.el.ExtValELResolver.getCompositeComponentExpression(ExtValELResolver.java:277) > at > org.apache.myfaces.extensions.validator.core.el.DefaultELHelper.getPropertyDetailsOfValueBinding(DefaultELHelper.java:169) > > at > org.apache.myfaces.extensions.validator.core.metadata.extractor.DefaultComponentMetaDataExtractor.extract(DefaultComponentMetaDataExtractor.java:77) > at > org.apache.myfaces.extensions.validator.util.ExtValUtils$1.extract(ExtValUtils.java:233) > > at > org.apache.myfaces.extensions.validator.core.interceptor.AbstractValidationInterceptor.getPropertyInformation(AbstractValidationInterceptor.java:176) > at > org.apache.myfaces.extensions.validator.core.interceptor.AbstractValidationInterceptor.processAfterValidation(AbstractValidationInterceptor.java:166) > > at > org.apache.myfaces.extensions.validator.core.interceptor.AbstractValidationInterceptor.beforeGetConvertedValue(AbstractValidationInterceptor.java:153) > at > org.apache.myfaces.extensions.validator.core.renderkit.ExtValRendererWrapper.getConvertedValue(ExtValRendererWrapper.java:369) > > at javax.faces.component.UIInput.getConvertedValue(UIInput.java:578) > at javax.faces.component.UIInput.validate(UIInput.java:510) > at javax.faces.component.UIInput.processValidators(UIInput.java:240) > at > javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1218) > > at > javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1218) > at javax.faces.component.UIForm.processValidators(UIForm.java:137) > at > javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1218) > > at > javax.faces.component.UIViewRoot._processValidatorsDefault(UIViewRoot.java:1251) > at javax.faces.component.UIViewRoot.access$500(UIViewRoot.java:77) > at > javax.faces.component.UIViewRoot$ProcessValidatorPhaseProcessor.process(UIViewRoot.java:1298) > > at javax.faces.component.UIViewRoot._process(UIViewRoot.java:1207) > at > javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:683) > at > org.apache.myfaces.lifecycle.ProcessValidationsExecutor.execute(ProcessValidationsExecutor.java:34) > > at > org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:149) > > The problem resides in how CompositeComponentELResolver works. In few > words, > it returns a Map that points to composite component attributes, but this > map > is traversed by default MapELResolver, not the same > CompositeComponentELResolver, so ExtValELResolver wrapper does not receive > the control before evaluate and compositeComponentExpressionBase is never > set. > > The solution should be do something similar to the hack done in > FlashELResolver. In that case, the resolver checks if the base is > instanceof > the map (in myfaces case CompositeComponentAttributesMapWrapper) and if so > return the value as MapELResolver does (or in other words as > FlashELResolver > does). > > I have not tested this solution yet but I think it will work. The behavior > proposed is not described on jsf 2.0 spec section 5.6.2.2, but I think we > can consider it an implementation detail and create a fix on myfaces. > Please > create an issue on myfaces issue tracker and I'll propose a patch for this > one. > > regards, > > Leonardo Uribe >

