Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Problema com escopo de requisição - JSF + Spring

Boa noite pessoal, trabalhando em minha aplicação percebi um comportamento indesejado. Ao logar como um usuário em navegador e tentar editar uma entidade por exemplo faz com que outro usuário logado em outro navegador tenha estes mesmos dados carregados nessa outra sessão. O que não deveria ocorrer, precisam ter comportamentos independentes.

Meu bean / controller:

@Controller
@Scope("request")
public class UsuarioBean implements Serializable {

    private static final long serialVersionUID = 1L;

    @Autowired
    private UsuarioDAO usuarioDAO;
    @Autowired
    private CategoriaDAO categoriaDAO;
    @Autowired
    private FacesContext context;
    @Autowired

 // código omitido

Tentei fazer uso da anotação do Spring @Scope("request") mas em contrapartida a aplicação passa a ter a seguinte exception:

Error creating bean with name 'usuarioBean': Unsatisfied dependency expressed through field 'context'; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'javax.faces.context.FacesContext' available: expected single matching bean but found 2: com.sun.faces.context.FacesContextImpl@6c42f332,getFacesContext

Minha classe que produz o FacesContext:

package br.com.ygormagalhaes.sgcv.util;

import java.io.Serializable;

import javax.faces.context.FacesContext;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.annotation.RequestScope;

@Configuration
public class FacesContextProducer implements Serializable {

    private static final long serialVersionUID = 1L;

    @Bean
    @RequestScope
    public FacesContext getFacesContext() {
        return FacesContext.getCurrentInstance();
    }
}

Já tentei usar @RequestScope também do Spring e tenho a mesma exception. Com @RequestScoped do próprio JSF o sistema funciona normalmente mas com o problema descrito.

5 respostas

Comentei todas as linhas em que o campo context fosse usado e tudo funcionou normalmente com o escopo de requisição, agora não tô conseguindo arrumar essa injeção do FacesContext :(

solução!

Oi Ygor,

tem como testar o código do Rafael (usando @Primary e proxyMode):

https://gist.github.com/rponte/210a0fc18452dbacf143

abs

Nico, funcionou perfeitamente!!

Agora me tira uma outra dúvida, eu percebi que ao editar uma entidade e salva-la o spring tá tratando os campos que eu nao mexi como vazios. Por exemplo, nesse formulário eu não tenho o campo de senha (que já está salva no banco)... Aí ao atualizar qualquer informação da minha entidade ele considera que a senha é "vazia" e altera as informações no BD.

Oi Ygor,

eu acho que sei a resposta. Tem como abrir uma nova pergunta para deixar isso documentado para outros alunos?

abs

Nova pergunta aberta!