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

Erro ao testar a pagina de login

Senhores (as), tudo bem ?

Bem estou com um problema, sempre que estou testando a pagina xhtml relacionada ao login, esta indicando erro, informando que a propriedade efetuaLogin, mas ao olhar na classe ela esta la '-'.

Segue informacao do erro e das minhas classes.

Erro:

exception

javax.servlet.ServletException: /login.xhtml: Property 'efetuaLogin' not found on type br.com.caelum.livraria.bean.LoginBean
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

javax.el.ELException: /login.xhtml: Property 'efetuaLogin' not found on type br.com.caelum.livraria.bean.LoginBean
    com.sun.faces.facelets.compiler.AttributeInstruction.write(AttributeInstruction.java:94)
    com.sun.faces.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:82)

Login.xhtml:

<?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">

<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">
                    </h:inputText>

                    <h:message for="email" id="messageEmail" />

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

                    <h:message for="senha" id="messageSenha" />

                    <h:commandButton value="Efetuar Login"
                        action="#{loginBean.efetuaLogin}" />
                </h:panelGrid>
            </fieldset>
        </h:form>
    </ui:define>

</ui:composition>

</html>

loginBean

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;
    }

    /**
     * Funcao para verificar se o usuario existe realmente ou nao, caso nao seja encontrado 
     * o sistema enviara uma mensagem alertando ao usuario.
     * @return Usuario
     */
    public String efetuaLogin() {
        System.out.println("Fazendo login do usuário " + this.usuario.getEmail());

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

}

Classe Usuario:

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 senha;
    private String email;

    public Integer getId() {
        return id;
    }

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

    public String getSenha() {
        return senha;
    }

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

    public String getEmail() {
        return email;
    }

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

}
4 respostas
solução!

Olá Julio!

Você pode informar qual o servidor e qual a versão do JSF que você está utilizando?

Aparentemente, a expression language do commandButton não está sendo reconhecida como uma action. Nesse caso, ele vai tratar o efetuaLogin não como um método a ser invocado mas como uma propriedade exigindo getter e setter.

Vamos ver se conseguimos descobrir a causa do problema com as informações adicionais.

Oi Julio, tudo bem ?

Algo que está faltando para que o JSF precisa é o gettere o settterda propriedade Usuariono seu ManagedBean.

Outra coisa que pode estar acontecendo é referente aos imports que você fez no xhtml, geralmente usamos : http://java.sun.com/jsf/

Espero ter ajudado !

Abraços

Jeferson, tudo bem ?

Estou usando a versao do tomcat 7 e o javax.faces-2.2.13

Descobri o meu erro, eu havia deixado a versao antiga do faces dentro do projeto ao deletar e recompilar o projeto funcionou.

Acredito que por ter 2 jar semelhantes o projeto estava dando erro :)

Matheus, tudo bem ?

estou usando estes namespace (

<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">

pois o projeto havia começado com o jsf 2.1 e apos alguns capitulos o curso havia sido atualizado para rodar na versao 2.2