[ 
https://issues.apache.org/jira/browse/MYFACES-3168?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13052221#comment-13052221
 ] 

Leonardo Uribe commented on MYFACES-3168:
-----------------------------------------

Thanks for the example provided. It makes easier to detect what's going on.

The code proposed has a flaw. It is more a side effect, caused by the 
evaluation of #{cc} and the fact that the component stack is not set on that 
location. 

PreRenderViewEvent is an event propagated to UIViewRoot. In this case, you are 
using a component to listen to that event, so the component stack is not set 
and when the expressions are resolved, they can't found the right composite 
component instance and the final result is the one you described.

The solution is very simple to do. Just try this:

        private void processPreRenderViewEvent(PreRenderViewEvent e) throws 
AbortProcessingException  {
                
            FacesContext ctx = getFacesContext();
                
                if(!ctx.isPostback()) {
                        
                    this.pushComponentToEL(ctx, this);
                    try
                    {
                              /** .... **/
                    }
                    finally
                    {
                        this.popComponentFromEL(ctx);
                    }
                }

I tested it and it works. I tried to do something on UIViewRoot, but it doesn't 
seem to be correct, because it is an event tied to the view, so it should be 
responsibility of the developer to set context, in that case put the current 
component onto the stack.

In other topic, this is a better way to suscribe the event:

@ListenerFor(systemEventClass=PostAddToViewEvent.class)
public class UIComponent1 extends UIComponentBase implements NamingContainer, 
SystemEventListener {

        public UIComponent1() {
        }

        @Override
    public void processEvent(ComponentSystemEvent event)
            throws AbortProcessingException
    {
        super.processEvent(event);
        
        if (event instanceof PostAddToViewEvent)
        {
            
getFacesContext().getViewRoot().subscribeToViewEvent(PreRenderViewEvent.class, 
this);
        }
    }

In few words, use PostAddToViewEvent to suscribe the listener is better because 
the component is now attached to the view, so that is the right time to do 
that. Anyway, do it inside the constructor works. I'll close this issue as 
invalid.

> Bound attribute values resolve to NULL during PreRenderViewEvent for nested 
> composite components
> ------------------------------------------------------------------------------------------------
>
>                 Key: MYFACES-3168
>                 URL: https://issues.apache.org/jira/browse/MYFACES-3168
>             Project: MyFaces Core
>          Issue Type: Bug
>          Components: General
>    Affects Versions: 2.0.6, 2.1.0
>         Environment: Windows 7 x64 Enterprise. 
> JDK 1.6.0_25. 
> Eclipse Version: Helios Service Release 2
> Build id: 20110218-0911
>            Reporter: MAtthew Sweeney
>         Attachments: jsf-testing-myfaces.zip, screenshot-1.jpg
>
>
> When nesting custom composite components, any data bound attributes (eg 
> #{someValueExpression} ) will resolve to null during the PreRenderViewEvent. 
> This only occurs on the second level or deeper nested component (the 
> top-level component in the page works fine).
> This same issue occurs on JSF RI 2.0.4, 2.1.x, 2.2.x
> I have an eclipse project for upload that reproduces the problem.
> I have no cause for the issue at this time.
> Cheers,
> Matt

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to