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

Usuario vindo da tela vazio

Toda vez que tento fazer login, meu usuário esta vindo vazio da tela, ja debugguei e não achei o erro

package br.com.caelum.livraria.bean;



import java.io.Serializable;

import javax.faces.application.FacesMessage;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;

import br.com.caelum.livraria.dao.UsuarioDao;
import br.com.caelum.livraria.modelo.Usuario;


@RequestScoped
@Named
public class LoginBean implements Serializable {

    private static final long serialVersionUID = 1L;

    private Usuario usuario=  new Usuario();
    private UsuarioDao usuarioDao;



    @Inject
    public LoginBean(UsuarioDao usuarioDao){
        this.usuarioDao= usuarioDao;
    }


    public String efetuaLogin() {


        System.out.println("fazendo login do usuario "+ usuario.getEmail());

        FacesContext context = FacesContext.getCurrentInstance();
        boolean existe = usuarioDao.existe(this.usuario);
        if(existe ) {
            context.getExternalContext().getSessionMap().put("usuarioLogado", this.usuario);
            return "livro?faces-redirect=true";
        }

        context.getExternalContext().getFlash().setKeepMessages(true);
        context.addMessage(null, new FacesMessage("Usuário não encontrado"));

        return "login?faces-redirect=true";
    }

    public String deslogar() {
        FacesContext context = FacesContext.getCurrentInstance();
        context.getExternalContext().getSessionMap().remove("usuarioLogado");
        return "login?faces-redirect=true";
    }






    public Usuario getUsuario() {
        return usuario;
    }
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets">

    <ui:composition template="_template.xhtml">

        <ui:define name="titulo">
                <p:outputPanel>Login</p:outputPanel>
        </ui:define>

        <ui:define name="conteudo">

            <p:messages globalOnly="true" />

            <h:form id="login">
                <p:fieldset legend="Login">
                    <h:panelGrid columns="3">

                        <p:outputLabel value="Email:" for="email" />
                        <p:inputText id="email" value="#{loginBean.usuario.email}" required="true">
                            <f:passThroughAttribute name="type" value="email" />
                        </p:inputText>
                        <p:message for="email" id="messageEmail" />

                        <p:outputLabel value="Senha:" for="senha" />
                        <p:password id="senha" value="#{loginBean.usuario.senha}" feedback="true"  required="true" />
                        <p:message for="senha" id="messageSenha" />

                        <p:commandButton value="Efetue Login" action="#{loginBean.efetuaLogin}" update="@form" process="@form" />
                    </h:panelGrid>
                </p:fieldset>
            </h:form>
        </ui:define>

    </ui:composition>

</html>
7 respostas

Olá Camila, tudo bem?

Tente mudar o import da sua anotação @RequestScoped de: javax.faces.bean.RequestScoped para: javax.enterprise.context.RequestScoped.

Oi Fernando, tudo sim e vc? Quando troco ele da um warning Type LoginBean (with a non-private constructor with no parameters) is not a legal type of normal scoped bean LoginBean because it cannot be proxied by the container [JSR-346 §3.15]

solução!

Tudo sim! =)

Sendo um warning não deveria dar problema. Você chegou a testar para ver se está injetado corretamente?

De qualquer forma vamos fazer um teste, para ver se o container para de lançar esse warning.

Ao invés de receber o seu UsuarioDao injetado via construtor, receba ele injetado via atributo.

Altere de:

...
private UsuarioDao usuarioDao;

@Inject
    public LoginBean(UsuarioDao usuarioDao){
        this.usuarioDao= usuarioDao;
    }

...

Para:

...
@Inject
private UsuarioDao usuarioDao;


//@Inject
//public LoginBean(UsuarioDao usuarioDao){
//   this.usuarioDao= usuarioDao;
//}

...

Veja se assim ele para de dar o warning.

Assim ele retirou o warning .

E está sendo injetado corretamente o UsuarioDao?

Sim, está.

Blz, vou fechar o tópico então.

Bons estudos.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software