Problema ManagedBean Sessão JSF

12 respostas
viniciusfaleiro

To com um problema um tanto quanto estranho… estou fazendo uma validação de uma entidade Funcionario… Faço uma consulta com Hibernate pra saber se o funcionário existe no banco… se Sim… ele navega pra próxima página…
Esse ManagedBean Funcionario, eu adicionei com escopo de sessão…

<managed-bean>
        <managed-bean-name>func</managed-bean-name>
        <managed-bean-class>MngBeans.Funcionario</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
     </managed-bean>

Pelo que sei, essa instancia vai ficar disponível para mim durante a sessão do usuário…

Criei um form de login… Onde são necessários RG, Data de Nascimento e Código da Empresa (Sem senha…)…

Esse é meu ManagedBean que valida o usuário:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package MngBeans;

import DAOs.FuncionarioDAO;
import javax.faces.context.FacesContext;
import org.hibernate.Session;


/**
 *
 * @author Vinicius
 */
public class LoginBean {

    /** Creates a new instance of LoginBean */
    public LoginBean() {
    }

    public String logar(){
        try{
            Session session = Util.HibernateUtil.getSessionFactory().openSession();
            FuncionarioDAO acessoDAO = new FuncionarioDAO(session);

            FacesContext fc = FacesContext.getCurrentInstance();
            Funcionario func = (Funcionario) fc.getApplication().getVariableResolver().resolveVariable(fc, "func");
            FuncionarioPK func_pk = (FuncionarioPK) fc.getApplication().getVariableResolver().resolveVariable(fc, "funcpk");
            Empresa empresa = (Empresa) fc.getApplication().getVariableResolver().resolveVariable(fc, "empresa");

            func_pk.setEmpresaId(empresa.getId());
            func.setFuncionarioPK(func_pk);

            return acessoDAO.verificaAutenticacao(func);
        }catch(Exception e){
            return "Erro no VariableResolver." + e.getMessage();
        }
    }

}

Dai que vem o seguinte… No DAO eu faço a seguinte validação:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package DAOs;

import MngBeans.Funcionario;
import MngBeans.FuncionarioPK;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.hibernate.Query;
import org.hibernate.Session;

/**
 *
 * @author Vinicius
 */
public class FuncionarioDAO {
    private Session session;

    public FuncionarioDAO(Session session) {
        this.session = session;
    }

    @SuppressWarnings("unchecked")
    public String verificaAutenticacao(Funcionario func) {
        try{
            Query query = session.createQuery("SELECT u FROM Funcionario u WHERE u.funcionarioPK.rg =:rg AND u.funcionarioPK.empresaId =:empresa AND u.dtNascimento =:birth");
            query.setInteger("rg", func.getFuncionarioPK().getRg());
            query.setInteger("empresa", func.getFuncionarioPK().getEmpresaId());
            query.setDate("birth",func.getDtNascimento());

            Funcionario fnc = (Funcionario) query.uniqueResult();

            if (fnc == null) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Funcionário Desconhecido"));

                return null;
            } else if(fnc.getAtivo().getId() == 3) {
                func = fnc;
                return "usr_ok";
            } else {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Funcionário desligado"));

                return null;
            }
        }catch(Exception e){
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Erro no DAO." + e.getMessage()));

            return null;
        }

    }
}

Veja que eu passei como parametro o ManagedBean de Funcionário que está na sessão… Dai faço a consulta… se ela for ok… eu retorno usr_ok e navego para a página… Más tem um porém… o meu Funcionário que veio como parametro tem apenas alguns dados setados (somente os dados necessários para fazer login)… Depois que faço a consulta, o Hibernate me volta um funcionário com todos os dados preenchidos… (No meu código Funcionario fnc = (Funcionario) query.uniqueResult())… O que eu faço então é atribuir esse Funcionário ao meu managedBean que está na sessão:

else if(fnc.getAtivo().getId() == 3) {
                func = fnc;
                return "usr_ok";
            }

Agora o mais estranho… Depois de navegar para a próxima página… se eu colocar isso:

<h:outputText value="#{func.dtNascimento}"/><br>
        <h:outputText value="#{func.nome}"/><br>

Apenas a data de nascimento sai na tela… Será que esse lance de atribuir a entidade de retorno do Hibernate para O managedbean não funciona??? COmo eu faria? Estou fazendo certo?

12 Respostas

jeroqueiroz

Não tenho muita vivencia com Hibernate, porém qto a parte java se ele estiver trazendo certo e estranho o que acontece…

Porém você qdo usa o debug após a busca ele preenche os dados corretamente, antes de direcionar pra outra pagina?.

viniciusfaleiro

Cara… o Bean ta certinho… já tinha depurado… Inclusive se eu der set em todos os campos ele vai certnho dai… soh que é foda ficar dando set em cada um… Será que tem uma alternativa?

diegosantiviago

se a data sai, mas o nome não, estranho.

você tem o método getNome() ? Vê se não tá getName() :shock:

viniciusfaleiro

O data sai pq provalmente foi quando o cara definiu o valor da data no formulario de login… Não tem como eu ter errado o nome do campo e gets e sets pq gerou tudo automático… se alguém souber alguma solução…agradeço… por enquanto estou fazendo set em todos os campos

diegosantiviago

fiquei curioso:

query.setInteger("rg", func.getFuncionarioPK().getRg()); query.setInteger("empresa", func.getFuncionarioPK().getEmpresaId()); query.setDate("birth",func.getDtNascimento());

W

Também fiquei intrigado, me ajudem a entender o problema?

Se o cabra só é requisitado a digitar : RG. dtNascimento e código da empresa… pq após o “clique” dele, você espera mais parâmetroS para serem validados no teu DAO?

No caso a data de nascimento é “printada” na tela, pois o usuário digitou e está na sessão, já o nome não foi digitado e se você não setá-lo, de onde ele viria?

Num intindi não O_O!

viniciusfaleiro

Não… eu uso esses 3 paremetros pra fazer uma consulta na tabela do banco…

Quando o hibernate encontra esse cara ele retorna uma entidade preenchida com todos os campos da tabela…

Agora pensa comigo: A entidade que usei pra fazer a pesquisa tem somente 3 campos setados…

Utilizei esses campos pra preencher a Query do hibernate e ele encontrou uma resposta… Soh que quando ele volta a resposta estão todos os atributos preenchidos… Dai quero que o cara que está com apenas 3 parametros passe a ser o cara que veio do hibernate com todos preenchidos pra eu poder usar na sessão…

Eu não consegui isso fazendo… Funcionario antigo = Funcionario funcionario_do_hibernate (resumidamente)

Somente setando cada parametro do antigo… antigo.nome(funcionario_do_hibernate.getNome); e assim por diante

Não sei se fui claro o suficiente.

W

Foi sim! Pra mim ficou bem claro agora !

Não seria o caso de você setar esse objeto de retorno na sessão? tipo : sessionScope.setAttribute(“func” objetoFuncionarioQueVeioDoHibernate); , ou to viajando no

problema?

viniciusfaleiro

Até pensei nisso… más acho que o session não é o mesmo session do contexto JSF… deve ter que jogar dentro do contexto JSF pra substituir o antigo… sei lá… vc conhece como pegar a sessão do contexto JSF?

W

Aaa, sim sim, eu estava falando da sessão do JSF mesmo, não do Hibernate… pra pegar ela é assim :

HttpSession sessionScope = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);  
sessionScope.setAttribute("func", FuncionarioAlterado);
viniciusfaleiro

Perfeito era isso mesmo!!! Valeu pela ajuda =)…

FelipeGalli

Viva os Hello World =]

Criado 22 de fevereiro de 2010
Ultima resposta 22 de fev. de 2010
Respostas 12
Participantes 5