[RESOLVIDO]Recuperar FacesContext em Filter

5 respostas
C

Boa noite galera.

Como eu consigo recuperar o FacesContext em outra classe qualquer? Eu tentei FacesContext.getCurrentInstance() mas ele retorna null.
Estou tentando recuperar ele dentro de um Filter, no método doFilter.

Obrigado,

Cesar Pizolato

5 Respostas

guilherme737

Não se é a melhor solução mas vamos lá.

No método init eu fiz assim:

public void init(FilterConfig config) throws ServletException {
	this.filterConfig = config;
	this.contextFactory = (FacesContextFactory) FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
	this.lifecycleFactory = (LifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
	this.lifecycle = lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
}

e no doFilter:

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
	if (filterConfig == null)
		return;

        facesContext = contextFactory.getFacesContext(filterConfig.getServletContext(), request, response, lifecycle);

        .......
}

Espero ter ajudado.

C

Guilherme, muito obrigado pela ajuda, mais ele retorna null, veja se errei algo:

FilterConfig filterConfig;
FacesContextFactory contextFactory;
LifecycleFactory lifecycleFactory;
Lifecycle lifecycle;

@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain fc) throws IOException, ServletException {

		try {

			fc.doFilter(request, response);

			if (filterConfig == null) {
				return;
			}

			FacesContext facesContext = contextFactory.getFacesContext(
					filterConfig.getServletContext(), request, response,
					lifecycle);

			System.out.println("ViewID: "
					+ facesContext.getViewRoot().getViewId());

		} catch (Exception e) {
			System.out.println("[ PersistenceSessionFilter ERROR ] "
					+ e.getMessage());
		}
	}

	@Override
	public void init(FilterConfig config) throws ServletException {
		this.filterConfig = config;
		this.contextFactory = (FacesContextFactory) FactoryFinder
				.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
		this.lifecycleFactory = (LifecycleFactory) FactoryFinder
				.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
		this.lifecycle = lifecycleFactory
				.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
	}
Quando ele faz System.out.println("ViewID: " + facesContext.getViewRoot().getViewId()); da NullPointer.
C

Se eu fizer:

FacesContext fc = FacesContext.getCurrentInstance();

De qualquer lugar da aplicação, ele funcionar, menos do Filter, alguem sabe o pq? Como eu vou carregar do Filter então?

C
guilherme737:
Não se é a melhor solução mas vamos lá.

No método init eu fiz assim:

public void init(FilterConfig config) throws ServletException {
	this.filterConfig = config;
	this.contextFactory = (FacesContextFactory) FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
	this.lifecycleFactory = (LifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
	this.lifecycle = lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
}

e no doFilter:

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
	if (filterConfig == null)
		return;

        facesContext = contextFactory.getFacesContext(filterConfig.getServletContext(), request, response, lifecycle);

        .......
}

Espero ter ajudado.


Resolvi de outra forma Guilherme, obrigado pela ajuda.

guilherme737

Postaí então, é sempre bom ter mais uma alternativa para a solução de um problema. :wink:

Criado 21 de março de 2011
Ultima resposta 23 de mar. de 2011
Respostas 5
Participantes 2