Iniciar Managed Bean ao acessar uma página

Pessoal,

Tenho esse problema que venho contornando de diversas formas, mas queria ajuda para encontrarmos uma solução direta:

[list]Quando acesso uma página JSF diretamente via URL os MBs que são usados nessa página não são inicializados com as propriedades que mapeei no faces-config.[/list]
[list]Essa inicialização só acontece quando acesso o MB via alguma action, mas nem sempre esse é o caso.[/list]

Estou usando o MyFaces.

As soluções de contorno que já utilizei foram: um javascript redirecionando via jsFunction do a4j e iniciar o MB via PhaseListener… mas queria saber se tem alguma solução mais rápida, mais lógica, intuitiva…

Valeu!!

PS.: Tentei alguma coisa via PostConstruct, mas nada…

A mais elegante acho que é inciar o MBean no PhaseListener mesmo.

Obrigado pela resposta Marcos,

Penso que num PhaseListener minha lógica fica segmentada demais. Navegando pelo código não é intuitivo buscar pelo PhaseListener.

Por ora optei por utilizar um método PostConstruct que inicia as propriedades “manualmente”.

A situação atual é mais tranquila porque o caso que estou tratando é controlado por mim mesmo e tenho certeza de que um parâmetro será passado junto à URL.

A solução atual está como segue:

@PostConstruct
    public void verificarNecessidadeCarregamentoManual () {
        boolean ehNecessarioCarregamentoManual =
                FacesContext.getCurrentInstance().getExternalContext()
                .getRequestParameterMap().get("carregarManualmente") != null;

        if (ehNecessarioCarregamentoManual ) {
            this.servico1 = (Servico1) ManagedBeanLoader.abrirManagedBean(Servico1.class);
            this.servico2 = (Servico2) ManagedBeanLoader.abrirManagedBean(Servico2.class);
        }
    }

O ManagedBeanLoader é uma classe simples que criei e que ainda utilizo, mas que tento não mais precisar dela:

public class ManagedBeanLoader {

    public static Object abrirManagedBean (Class mb) {
        return abrirManagedBean(mb.getSimpleName(), mb);
    }

    public static Object abrirManagedBean (String mappedName, Class mb) {
        FacesContext facesContext = FacesContext.getCurrentInstance();

        return facesContext.getApplication()
                    .evaluateExpressionGet(facesContext, "#{" + mappedName + "}", mb);
    }
}

Ainda busco outra solução…

Você poderia criar um PhaseListener, instanciar seus MBs nele na implementação dos métodos beforePhase() ou o afterPhase().
Dá uma lida para pegar o entendimento do ciclo de vida do JSF que vai facilitar a sua vida!

:smiley:

Valeu Rodrigo!

Cara, mas realmente não penso que um PhaseListener seja uma boa opção… o código não fica claro mesmo

Utilizo o PhaseListener só quando ele faz um sentido maior… como por exemplo na verificação de login válido antes de processar cada requisição…