Iniciar Managed Bean ao acessar uma página

4 respostas
R

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…

4 Respostas

marcosharbs

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

R

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…

rodrigovfsilva

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:

R

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…

Criado 25 de agosto de 2011
Ultima resposta 25 de ago. de 2011
Respostas 4
Participantes 3