acelets @JSF 2 <f: metadata /> no modelo e na página

Tenho o seguinte modelo (masterLayout.xhtml):

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets">
    <f:view contentType="text/html">
        <ui:insert name="metadata"/>
        <h:head>
            <title><ui:insert name="windowTitle"/> | MySite</title>
        </h:head>

        <h:body>
            <div id="container">
                <div id="header">
                    <ui:insert name="header">
                        <ui:include src="/WEB-INF/templates/header.xhtml"/>
                    </ui:insert>
                </div>
                <div id="content">
                    <ui:insert name="content"/>
                </div>
                <div id="footer">
                    <ui:insert name="footer">
                        <ui:include src="/WEB-INF/templates/footer.xhtml"/>
                    </ui:insert>
                </div>
            </div>
        </h:body>
    </f:view>
</html>

e página que o usa (search.xhtml):

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title></title>
    </h:head>
    <h:body>
        <ui:composition template="/WEB-INF/templates/masterLayout.xhtml">
            <ui:define name="metadata">
                <f:metadata>
                    <f:viewParam name="address" value="#{searchBean.address}"/>
                    <f:event type="preRenderView" listener="#{userSessionBean.preRenderViewCookieLogin(e)}"/>
                    <f:event type="preRenderView" listener="#{searchBean.preRenderView(e)}"/>
                </f:metadata>
            </ui:define>
            <ui:define name="windowTitle">#{searchBean.address}</ui:define>

            <ui:define name="content">

                <!-- Content goes here -->

            </ui:define>
        </ui:composition>
    </h:body>
</html>

O problema é que quero fazer a chamada parauserSessionBean.preRenderViewCookieLogin(e) no modelo porque existem muitas outras páginas. Esse método verifica se o usuário está logado (de acordo com o estado da sessão) e, se não, verifica se há um cookie disponível que pode ser usado para efetuar login no usuário e, se estiver (e se for válido), efetua login automaticamente no usuário . O sistema funciona no código acima, mas quando tento inserir isso no modelo, meus parâmetros de exibição não estão mais sendo definido

Aqui está a versão modificada do acima, comuserSessionBean.preRenderViewCookieLogin(e) empurrado para o modelo.

masterLayout.xhtml:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets">
    <f:view contentType="text/html">
        <f:metadata>
            <f:event type="preRenderView" listener="#{userSessionBean.preRenderViewCookieLogin(e)}"/>
            <ui:insert name="metadata"/>
        </f:metadata>
        <h:head>
            <title><ui:insert name="windowTitle"/> | MySite</title>
        </h:head>

        <h:body>
            <div id="container">
                <div id="header">
                    <ui:insert name="header">
                        <ui:include src="/WEB-INF/templates/header.xhtml"/>
                    </ui:insert>
                </div>
                <div id="content">
                    <ui:insert name="content"/>
                </div>
                <div id="footer">
                    <ui:insert name="footer">
                        <ui:include src="/WEB-INF/templates/footer.xhtml"/>
                    </ui:insert>
                </div>
            </div>
        </h:body>
    </f:view>
</html>

search.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title></title>
    </h:head>
    <h:body>
        <ui:composition template="/WEB-INF/templates/masterLayout.xhtml">
            <ui:define name="metadata">
                <f:viewParam name="address" value="#{searchBean.address}"/>
                <f:event type="preRenderView" listener="#{searchBean.preRenderView(e)}"/>
            </ui:define>
            <ui:define name="windowTitle">#{searchBean.address}</ui:define>

            <ui:define name="content">

                <!-- Content goes here -->

            </ui:define>
        </ui:composition>
    </h:body>
</html>

Observe que mudei o<f:metadata/> tag para o modelo. Só isso é o problema de removeruserSessionBean.preRenderViewCookieLogin(e) Não faz diferença. Eu também tentei uma variação no código que funcionava, que era apenas moveruserSessionBean.preRenderViewCookieLogin(e) no modelo, o que significa que não pode estar dentro do<f:metadata/> tag. Nesse caso, esse método foi executado após todos os parâmetros de exibição terem sido definidos esearchBean.preRenderView(e) chamado. Eu querouserSessionBean.preRenderViewCookieLogin(e) para ser chamado antes de qualquer páginapreRenderView(e) é chamado, não depois. E só por diversão, tentei colocar um<f:metadata/> por aíuserSessionBean.preRenderViewCookieLogin(e), que chamou esse método, mas não definiu os parâmetros de exibiçã

Então, eu gostaria de saber:

Por que isso está acontecendo e existe uma maneira de corrigi-lo? Existe uma maneira melhor de garantir que o mesmo método seja chamado para cada página antes de mais alguma cois

Editar Acabei de tentar outra coisa - um evento de fase:<f:view contentType="text/html" beforePhase="#{userSessionBean.beforePhase(e)}"> Isso está em masterLayout.xhtml. Não está sendo chamado de forma alguma; não para nenhuma fase.

Editar Removeu oe (maldito NetBeans!):<f:view contentType="text/html" beforePhase="#{userSessionBean.beforePhase}"> Isso é chamado apenas antes da fase de resposta de renderização, o que obviamente significa que é chamado após opreRenderView evento é gerado.

questionAnswers(2)

yourAnswerToTheQuestion