4
respostas

javax.servlet.ServletException: /login.xhtml: Property 'efetuaLogin' not found on type br.com.caelum.livraria.bean.LoginBean

Olá!

Meu projeto está configurado com o JSF 2.0 (apesar de ter a lib para o 2.2), Java 8, Eclipse Neon.

Ao tentar executar meu projeto após as alterações do capítulo 11 de autorização, as telas não carregam e exibem a seguinte exceção:

HTTP Status 500 - /login.xhtml: Property 'efetuaLogin' not found on type br.com.caelum.livraria.bean.LoginBean

type Exception report

message /login.xhtml: Property 'efetuaLogin' not found on type br.com.caelum.livraria.bean.LoginBean

description The server encountered an internal error that prevented it from fulfilling this request.

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:53)

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)
    com.sun.faces.facelets.compiler.UILeaf.encodeAll(UILeaf.java:183)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782)
    com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:437)
    com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:124)
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

Pesquisei um pouco sobre o problema e aparentemente o JSF está evaluando a expressão como texto, ao invés de método. Entretanto, não consigo obter solução. Mesmo após tentar passar o projeto para JSF 2.2, o problema não é solucionado.

Agradeço desde já.

4 respostas

Posta o seu login.xhtml e o LoginBean?

LoginBean.java

package br.com.caelum.livraria.bean;

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

import br.com.caelum.livraria.dao.UsuarioDao;
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());

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

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

        return null;
    }

}

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:messages globalOnly="true" />

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

Acho que talvez o problema seja que meu projeto está configurado ára Java 8 e JSF2.0, rodando no Tomcat v9.0.

Thabita, no lugar de

<h:commandButton value="Efetuar Login" action="#{loginBean.efetuaLogin}" />

coloca

<h:commandButton value="Efetuar Login" action="#{loginBean.efetuaLogin()}" />

Atente para os parênteses no método efetuaLogin().

Testa e posta o resultado.