Problema de inicialização de aplicação JSF com Mojarra em ambiente Tomcat embutido
O erro ocorre durante a inicialização de um aplicativo web que utiliza JSF (JavaServer Faces), mais especificamente com o Mojarra (implementação de referência do JSF), executado em um ambiente com Tomcat embutido no Spring Boot. O erro se manifesta nas seguintes mensagens principais:
-
“Unable to obtain InjectionProvider from init time FacesContext”: Indica que o provedor de injeção do JSF não pôde ser obtido corretamente, sugerindo uma falha na configuração do ambiente de injeção de dependências do Mojarra.
-
“Application was not properly initialized at startup, could not find Factory: javax.faces.context.FacesContextFactory”: O framework JSF não conseguiu localizar a fábrica
FacesContextFactory
, um componente essencial para o funcionamento do ciclo de vida de um aplicativo JSF. -
“Could not find backup for factory javax.faces.context.FacesContextFactory”: Indica que, após não encontrar a fábrica principal, também não foi possível localizar uma alternativa de backup.
Esses erros ocorrem devido a uma falha na inicialização do JSF no contexto do Tomcat, onde a configuração necessária para o carregamento da configuração do Mojarra não é adequadamente processada.
Causa:
Esse problema é comum em projetos onde o arquivo web.xml
é gerado dinamicamente ou quando ele não está presente diretamente no projeto, como acontece com aplicações que utilizam Tomcat embutido. O JSF depende do arquivo web.xml
para carregar certas configurações no início da aplicação, e, quando ele é gerado dinamicamente, pode haver falhas na inicialização de componentes essenciais, como o FacesContextFactory
.
Solução:
A solução envolve a adição de um parâmetro de configuração específico para forçar o carregamento das configurações do JSF (Mojarra) durante a inicialização. Esse parâmetro é:
servletContext.setInitParameter("com.sun.faces.forceLoadConfiguration", "true");
Esse parâmetro, adicionado ao contexto do servlet, garante que o Mojarra carregue as configurações de forma adequada, corrigindo o problema relacionado à fábrica FacesContextFactory
.