Dúvida - Apostila Caelum FJ21 - 12.6 - Exercício: Fazendo o login na aplicação[Resolvido]

4 respostas
D

Amigos boa noite! Tudo Bem? Sou iniciante em java, estou estudando a apostila fj21 da caelum. Gostaria de ajuda de vocês para poder corrigir meu exercício, e assim entender o motivo do lançamento dessa exceção.

Ocorre o seguinte: Quando tento me logar na minha página login.jsp para a validação no banco, não sou redirecionado para a página menu.jsp, e uma exceção é lançada no console. Ao que parece está sendo lançada pelo struts 2:

Set 27, 2012 12:59:51 AM com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn
WARNING: Error setting expression ‘usuario.login’ with value ‘[Ljava.lang.String;@440e66e8
ognl.NoSuchPropertyException: br.com.caelum.tarefas.modelo.Usuario.login

at ognl.ObjectPropertyAccessor.setProperty(ObjectPropertyAccessor.java:166)
at com.opensymphony.xwork2.ognl.accessor.ObjectAccessor.setProperty(ObjectAccessor.java:28)
at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:2225)
at ognl.ASTProperty.setValueBody(ASTProperty.java:127)
at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
at ognl.SimpleNode.setValue(SimpleNode.java:301)
at ognl.ASTChain.setValueBody(ASTChain.java:227)
at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
at ognl.SimpleNode.setValue(SimpleNode.java:301)
at ognl.Ognl.setValue(Ognl.java:737)
at com.opensymphony.xwork2.ognl.OgnlUtil.setValue(OgnlUtil.java:198)
at com.opensymphony.xwork2.ognl.OgnlValueStack.setValue(OgnlValueStack.java:161)
at com.opensymphony.xwork2.ognl.OgnlValueStack.setValue(OgnlValueStack.java:149)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.setParameters(ParametersInterceptor.java:276)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:187)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:179)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:130)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:165)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:179)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488)
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

Pesquisei a respeito, porém não consegui encontrar uma explicação que tivesse relação com a minha dúvida. Podem por favor verificarem minhas classes, e me ajudarem a entender o que ocorreu nesse caso?

Segue meu AutorizadorAction;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;

import com.opensymphony.xwork2.ActionContext;

import br.com.caelum.tarefas.dao.UsuarioDAO;
import br.com.caelum.tarefas.modelo.Usuario;

public class AutorizadorAction {
	
	private Usuario usuario;
	
		@Action(value="login", results= {
			@Result(name="ok", location="/menu.jsp"),
			@Result(name="invalido", location="/login.jsp")
		})
		
	public String login() {
		if (new UsuarioDAO().existeUsuario(usuario)) {
			ActionContext.getContext().getSession().put("usuarioLogado", usuario);
			return "ok";
		}
		
		return "invalido";
	}
		
	public Usuario getUsuario() {
		return usuario;
	}
	
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
		
	}
}

UsuarioDAO;

package br.com.caelum.tarefas.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import br.com.caelum.tarefas.connectionfactory.ConnectionFactory;
import br.com.caelum.tarefas.modelo.Usuario;

public class UsuarioDAO {
	
	Connection connection;
	
	public UsuarioDAO() {
		this.connection = new ConnectionFactory().getConnection();
	}
	
	public boolean existeUsuario(Usuario usuario) {
		
		String sql = "select * from usuarios where usuario = ? and senha = ?";
		
			try {
				PreparedStatement stmt = this.connection.prepareStatement(sql);
				stmt.setString(1, usuario.getUsuario());
				stmt.setString(2, usuario.getSenha());
				
					ResultSet rs = stmt.executeQuery();
					
				stmt.execute();
				
					//Verifica se existe retorno na consulta
					if(rs.next()) {
						
						stmt.close();
						return true;
					}
					
				    else {
					  
					  	stmt.close();
					  	return false;
				  }
		
	      } catch (SQLException e) {
	    	  throw new RuntimeException(e);
	    	  
	      }
	 }
}

bean Usuario;

package br.com.caelum.tarefas.modelo;

public class Usuario {
	
	private String usuario;
	private String senha;
	
	public String getUsuario() {
		return usuario;
	}
	
	public void setUsuario(String usuario) {
		this.usuario = usuario;
	}
	
	public String getSenha() {
		return senha;
	}
	
	public void setSenha(String senha) {
		this.senha = senha;
	}

}

login jsp;

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
		<title>Login</title>
</head>
	<body>
		<h3>Página de login das tarefas</h3>
		<form action="login" method="post">
			Login: <input type="text" name="usuario.login"/><br/>
			Senha: <input type="password" name="usuario.senha"/><br/>
		<input type="submit" value="Entrar nas tarefas" >
		</form>
	</body>
</html>

menu.jsp;

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Menu</title>
	</head>
		<body>
			<h2>Página inicial da lista de Tarefas</h2>
			<p>Bem vindo, ${usuarioLogado.login}</p>
			<a href="listaTarefas">Clique aqui</a> para acessar a lista de tarefas
		</body>
</html>

Também criei a tabela “usuarios” no banco, e inseri os registros de usuario e senha conforme a apostila.
Muito obrigado!

[]´s

4 Respostas

DaniloAndrade

Bom dia

o que acontece é seguinte, no seu formulário html

<form action="login" method="post">  
            Login: <input type="text" name="usuario.login"/><br/>  
            Senha: <input type="password" name="usuario.senha"/><br/>  
        <input type="submit" value="Entrar nas tarefas" >  
        </form>

no name do input vc colocou isso name=“usuario.login”, ai o Struts 2 vai tentar popular a propriedade login na classe Usuario , mas sua classe usuario não possui a propriede login

package br.com.caelum.tarefas.modelo;  
  
public class Usuario {  
      
    private String usuario;  
    private String senha;  
      
    public String getUsuario() {  
        return usuario;  
    }  
      
    public void setUsuario(String usuario) {  
        this.usuario = usuario;  
    }  
      
    public String getSenha() {  
        return senha;  
    }  
      
    public void setSenha(String senha) {  
        this.senha = senha;  
    }  
  
}

e como ele não encontra a propriedade ele lança uma Exception “ognl.NoSuchPropertyException: br.com.caelum.tarefas.modelo.Usuario.login”

para resolver seu problema troque no seu formulario o name do input de usuario.login para usuario.usuario ou melhor mude o atributo usuario da sua classe Usuario para login.

obs: caso vc mude o nome do atributo altere tambem o getter e setter

D

Salve Danilo! Tudo Tranquilo?

Fiz exatamente como disse alterei o atributo no meu bean, dessa vez para login. Gerei o getter e setter e tudo funcionou normalmente.
O erro lançado no console era até bem intuitivo rs, mas fiquei na dúvida por que na apostila não existe o bean Usuario, e nem a classe UsuarioDAO. O exercício pede para você importá-los no projeto, talvez faça parte das aulas presenciais da caelum, e somente esteja disponível no pc’s da caelum mesmo rss.

Eu mesmo os criei para o exercício, tendo como referência os métodos dos exercícios posteriores da apostila, e também o que eu já tinha estudado anteriormente. Pela descrição do erro lançado, também achei que poderia ter a ver com struts2, por isso resolvi postar a dúvida para não virar uma bola de neve depois rss.

Mas enfim, muito obrigado por responder a minha dúvida amigo, pode ter certeza que ficarei mais atento a esse tipo de situação.

Vlw!

Abraço!

DaniloAndrade

por nada, precisando estamos ai pra ajudar

D

Brigadão mesmo!

[]´s

Criado 26 de setembro de 2012
Ultima resposta 27 de set. de 2012
Respostas 4
Participantes 2