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!

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…