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

Curso de JSF I: Capítulo 11

Boa tarde. No capítulo 11 do curso de JSF I, ele começa a desenvolver a autenticação do usuário. Porém, seguindo a explicação, antes de chegar no tópico "Verificando a existência no usuário", ele pede pra testar a aplicação. Quando vou testar, o correto seria que, ao clicar no botão "Efetuar Login", seria redirecionado para a página livro.xhtml. Porém, quando eu clico nesse botão, todos os meus campos da página login.xhtml são limpados e aparece essa mensagem no console:

ago 03, 2016 4:48:32 PM com.sun.faces.renderkit.RenderKitUtils renderUnhandledMessages INFORMAÇÕES: AVISO: FacesMessage(s) foram enfileirados, mas podem não ter sido exibidos. sourceId=null[severity=(INFO 0), summary=(Usuário não encontrado), detail=(Usuário não encontrado)]

Alguém sabe o que poderia estar acontecendo? Desde já agradeço.

9 respostas

Segue abaixo a minha página login.xhtml, e minhas classes Usuario, e LoginBean respectivamente.

<?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:ui="http://xmlns.jcp.org/jsf/facelets">

    <h:head></h:head>

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

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

        <ui:define name="conteudo">
            <h:form id="login">
                <fieldset>
                    <legend>Login</legend>
                    <h:panelGrid columns="3">

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

                        <h:outputLabel value="Senha:" for="senha" />
                        <h:inputText id="senha" value="#{loginBean.usuario.senha}"
                            required="true">
                            <f:passThroughAttribute name="type" value="password" />
                        </h:inputText>
                        <h:message for="senha" id="messageSenha" /> 

                        <h:commandButton value="Efetuar Login" 
                            action="#{loginBean.efetuaLogin}" />
                    </h:panelGrid>
                </fieldset>
            </h:form>
        </ui:define>
    </ui:composition>
</html>
package br.com.caelum.livraria.modelo;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Usuario implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    private Integer id;
    private String email;
    private String senha;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

}
package br.com.caelum.livraria.bean;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

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

@ManagedBean
@ViewScoped
public class LoginBean {

    private Usuario usuario = new Usuario();

    public Usuario getUsuario() {
        return usuario;
    }

    public String efetuaLogin() {
        System.out.println("Fazendo login do usuário " + this.usuario.getEmail());

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

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

}

Tem como postar o código do seu Bean de login e o xhtml da pagina de login para analizarmos. O erro diz que o usuário não foi encontrado, pode ser porque o escopo do bean não está correto e o Dao não está conseguindo fazer a procura, mas olhando o código fica mais fácil de analisar.

Um possível problema pode ser o fato de seu LoginBean não implementar Serializable. Dessa forma ele pode não estar conseguindo acessar os atributos e preencher os valores.

solução!

Achei a solução. Revendo o vídeo novamente, tem uma parte que ele insere o usuário manualmente no banco. Na explicação, essa parte está depois desses passos. Só que ele pede pra testar antes. Testando sem o usuário no banco fica dando essa mensagem. Depois que eu inseri um usuário no banco ele redirecionou corretamente. Muito obrigado pela ajuda Marcio.

Sem problemas, em geral os logs são bem explicativos e ajudam a achar o problema.

Só que ainda me ficou uma dúvida. Como ele está acessando o banco se eu ainda não implementei nem se quer criei a classe UsuarioDao?

Então olhando assim não conseguir ver onde ele está fazendo isso. No código ele coloca um boolean existe para verificar isso

public String efetuaLogin() {
    System.out.println("Fazendo login do usuário "
            + this.usuario.getEmail());

    boolean existe = new UsuarioDao().existe(this.usuario);

    if (existe) {
        return "livro?faces-redirect=true";
    }

    return null;
}

Tem certeza que no seu código não está implementada está parte?

Até aonde ele pede pra testar a primeira vez, o método efetuaLogin só está assim:

public String efetuaLogin() {
        System.out.println("Fazendo login do usuário " + this.usuario.getEmail());

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

Com isso, ele só imprimi essa mensagem no console e redireciona para a página livro.

É está dificil de achar tentar usar a procura do Eclipse para encontrar onde há chamadas de UsuarioDao. O atalho é ctrl + h, na aba de file search e procura por UsuarioDao.