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:

  1. “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.

  2. “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.

  3. “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.

Referências


getting SEVERE - Unable to obtain InjectionProvider from init time FacesContext from tomcat and grails