[RESOLVIDO] JSF2 - propriedade do Manageb Bean não encontrada

9 respostas
J

Pessoal,

tenho uma webapp (primefaces3.3.1, jpa2, jsf2, eclipse, tomcat7, mysql) que está lançando a seguinte exception:

exception
javax.servlet.ServletException: /aluno_jsf.xhtml: Property 'logout' not found on type br.com.aluno.controller.LoginMB
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:422)

root cause
javax.el.ELException: /aluno_jsf.xhtml: Property 'logout' not found on type br.com.aluno.controller.LoginMB
[...]

Tenho o seguinte @ManagedBean:

package br.com.aluno.controller;

import java.io.Serializable;
import java.util.Collection;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import br.com.aluno.dao.DaoFactory;
import br.com.aluno.entity.Usuario;
import br.com.aluno.util.JsfUtil;

@ManagedBean
public class LoginMB implements Serializable {
	private static final long serialVersionUID = 6667329439219329074L;

	private Usuario usuario;

	@PostConstruct
	public void init() {
		usuario = new Usuario();
	}

	public void logar() {
		try {
			Collection<Usuario> usuarios = DaoFactory
					.getDAOFactory(DaoFactory.JPA).getUsuarioDao()
					.validarLogin(usuario);
			if (usuarios != null && usuarios.size() == 1) {

				usuario = usuarios.iterator().next();

				HttpSession session = (HttpSession) FacesContext
						.getCurrentInstance().getExternalContext()
						.getSession(true);
				if (session != null) {
					session.setAttribute("usuario", usuario);
					session.setAttribute("usuarioTipo", usuario.getClass()
							.getName());
				}
			} else {
				JsfUtil.addErrorMessage("Login ou senha invalida",
						"Login ou senha invalida");
			}
		} catch (Exception e) {
			JsfUtil.addFatalMessage("Entre em contato com o administrador",
					e.getMessage());
		}
	}

	public String logout() {
		HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
				.getExternalContext().getSession(false);
		if (session != null) {
			session.invalidate();
		}
		return "/login?faces-redirect=true";
	}

	public Usuario getUsuario() {
		return usuario;
	}

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

Tenho uma href (index.html) que direciona para login.xhtml:

<ui:decorate xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:p="http://primefaces.org/ui" template="/aluno_jsf.xhtml">

	<ui:define name="conteudo">
		<h:form rendered="#{sessionScope.usuario == null}">
			<h3>Login</h3>
			<p:messages id="messages" showDetail="true" autoUpdate="true" />
			<h:panelGrid columns="2">
				<p:outputLabel for="login" value="Login:" />
				<p:inputText id="login" value="#{loginMB.usuario.login}" required="true" requiredMessage="Digite um login" />
				<p:outputLabel for="senha" value="Senha:" />
				<p:password id="senha" value="#{loginMB.usuario.senha}" required="true" requiredMessage="Digite uma senha" />
				<p:commandButton action="#{loginMB.logar}" value="Logar" ajax="false" />
			</h:panelGrid>
		</h:form>
	</ui:define>
</ui:decorate>

Conforme validação, renderizo as páginas conforme menu abaixo:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:p="http://primefaces.org/ui" >
<h:head>
	<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
	<title>aluno_jsf</title>
</h:head>
<h:body>
	<f:view>
		<h:form>
			<p:menubar
				rendered="#{sessionScope.usuarioTipo == 'br.com.aluno.entity.Administrador'}">
				<p:menuitem url="/administrador/cadastroCurso.xhtml" value="Cadastro de curso" />
				<p:menuitem url="/administrador/cadastroDisciplina.xhtml" value="Cadastro de disciplinas" />
				<p:menuitem url="/administrador/cadastroAluno.xhtml" value="Cadastro de alunos" />
				<p:menuitem url="/administrador/atribuiNota.xhtml" value="Atribuicao de notas para alunos" />
				<p:menuitem action="#{loginMB.logout}" value="Logout" />
			</p:menubar>
			<p:menubar
				rendered="#{sessionScope.usuarioTipo == 'br.com.aluno.entity.Aluno'}">
				<p:menuitem url="/aluno/nota.xhtml" value="Consulta de notas" />
				<p:menuitem url="/aluno/senha.xhtml" value="Alteracao de senha" />
				<p:menuitem action="#{loginMB.logout}" value="Logout" />
			</p:menubar>
		</h:form>
		<ui:insert name="conteudo">
		conteudo
		</ui:insert>
	</f:view>
</h:body>
</html>

Alguém sabe resolver ?

9 Respostas

M

vc jah tentou isso?

<p:menuitem action="#{loginMB.logout()}" value="Logout" />
F

[quote=mauriciot.silva]vc jah tentou isso?

<p:menuitem action="#{loginMB.logout()}" value="Logout" />

Também penso que seja isso. Do jeito que está você esta tentando acessar uma propriedade (com get e set) chamada logout no seu managed bean

E

tente ai…talvez de certo…kkk

<p:menuitem actionListener="#{loginMB.logout}" value="Logout" /> [
falou…

J
mauriciot.silva:
vc jah tentou isso?
<p:menuitem action="#{loginMB.logout()}" value="Logout" />
Aparentemente funcionou, mas agora há outra exception agora:
exception

javax.servlet.ServletException: javax/persistence/Persistence
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:422)

root cause

java.lang.NoClassDefFoundError: javax/persistence/Persistence
	br.com.aluno.util.JpaUtil.<clinit>(JpaUtil.java:12)
	br.com.aluno.dao_jpa.JpaUsuarioDao.validarLogin(JpaUsuarioDao.java:46)
	br.com.aluno.controller.LoginMB.logar(LoginMB.java:30)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	java.lang.reflect.Method.invoke(Method.java:601)
	javax.el.BeanELResolver.invoke(BeanELResolver.java:484)
	javax.el.CompositeELResolver.invoke(CompositeELResolver.java:161)
	org.apache.el.parser.AstValue.getValue(AstValue.java:159)
	org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
	com.sun.faces.facelets.el.ELText$ELTextVariable.toString(ELText.java:214)
	com.sun.faces.facelets.compiler.AttributeInstruction.write(AttributeInstruction.java:89)
	com.sun.faces.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:82)
	com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:302)
	com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185)
	com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:129)
	javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:1756)
	javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
	javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:1756)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759)
	com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:401)
	com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
	com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
	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:410)
J

[quote=felipeaqueiroz]

mauriciot.silva:
vc jah tentou isso?

<p:menuitem action="#{loginMB.logout()}" value="Logout" />

Também penso que seja isso. Do jeito que está você esta tentando acessar uma propriedade (com get e set) chamada logout no seu managed bean

aparente funcionou, mas agora há outra exception (vide acima).
Achei estranho, porque já invoquei métodos sem parenteses em outra webapp.

S

[quote=jMarcel]

felipeaqueiroz:
mauriciot.silva:
vc jah tentou isso?

<p:menuitem action="#{loginMB.logout()}" value="Logout" />

Também penso que seja isso. Do jeito que está você esta tentando acessar uma propriedade (com get e set) chamada logout no seu managed bean

aparente funcionou, mas agora há outra exception (vide acima).
Achei estranho, porque já invoquei métodos sem parenteses em outra webapp.

está faltando biblioteca jpa na pasta lib do seu servidor.

E

Ele não encontrar porque ele procura um get para o logout, achando que ele é uma variável. Se tirar o “()” do xhtml e colocar getLogout no seu mb, acredito que funcionará.

L

Este último erro está ocorrendo pois falta adicionar a biblioteca de persistencia ao seu projeto.

E estava dando erro antes, pois é como o pessoal falou: sem os parênteses, o jsf entende como sendo uma propriedade que possua get/set;
Métodos sem os parenteses, é somente no caso de actionListener.

J

Eu já havia pensado e tentei fazer isso antes, mas, mesmo assim, a exception continuou ocorrendo.
Uma vez que a EL2.2 diz que é dispensável o uso de parenteses para invocarmos action methods, analisei bem e descobri que estava faltando incluir alguns jars na lib do webserver (que por sinal isso não seria necessário quando uso o Netbeans - pelo menos nunca precisei fazer isso. Inclusive todas as libs já estavam devidamente referenciadas no buildpath do eclipse, mas mesmo assim, tive que incluir na lib do webserver também).

Criado 26 de julho de 2012
Ultima resposta 26 de jul. de 2012
Respostas 9
Participantes 7