5
respostas

Estou com dúvida no curso de Struts 2: a evolução de um padrão, no exercício 1 do capítulo Autenticando usuários: como funciona?.

esse exercício o http://localhost:8080/struts-tarefas/loginForm da o erro 404 e o http://localhost:8080/struts-tarefas/formulario-login ao adcionar login e senha o erro 500 type Exception report message description The server encountered an internal error that prevented it from fulfilling this request.

exception

java.lang.NullPointerException br.com.caelum.tarefas.dao.UsuarioDAO.existe(UsuarioDAO.java:22) br.com.caelum.tarefas.action.LoginAction.execute(LoginAction.java:13) 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:606)

5 respostas

Oi Ellyson,

Preciso ver o seu código pra ajudar.

Você chegou a debuggar pra tentar entender o problema?

Um abraço!

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>
            org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
     <session-config>
        <session-timeout>3</session-timeout>
    </session-config>
</web-app>
package br.com.caelum.tarefas.action;

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

import com.opensymphony.xwork2.ActionContext;

public class LoginAction {

    private Usuario usuario;

    public String execute() {
        if (new UsuarioDAO().existe(usuario)) {
            ActionContext.getContext().getSession()
                    .put("usuarioLogado", usuario);
            return "menu";
        } else {
            return "formulario-login";
        }
    }

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

    public Usuario getUsuario() {
        return usuario;
    }
}
package br.com.caelum.tarefas.model;

public class Usuario {
    private String login;
    private String senha;

    public Usuario(String login, String senha) {
        this.login = login;
        this.senha = senha;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getSenha() {
        return senha;
    }

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

}
package br.com.caelum.tarefas.dao;

import java.util.ArrayList;
import java.util.List;

import br.com.caelum.tarefas.model.Usuario;

public class UsuarioDAO {

     private static final List<Usuario> USUARIOS = new ArrayList<Usuario>();
     static {
         USUARIOS.add(new Usuario("admin", "complexo"));
         USUARIOS.add(new Usuario("guilherme", "silveira"));
     }

     public void adiciona(Usuario usuario) {
         USUARIOS.add(usuario);
     }

     public boolean existe(Usuario procura) {
         for(Usuario usuario : USUARIOS) {
             if(usuario.getLogin().equals(procura.getLogin()) &&
                     usuario.getSenha().equals(procura.getSenha())) {
                 return true;
             }
         }
         return false;
     }


}

formulario-login.jsp dentro de WebContent/WEB-INF/content

<html>
<body>
    <h2>Página de Login das Tarefas</h2>
    <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>
</htm>

menu.jsp em WebContent/WEB-INF/content

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

Crie mais um Action para direcionar ao loginForm que ainda não tem mapeamento, ou modifique a IndiceAction para direcionar ao mesmo. Exemplo:

package br.com.caelum.tarefas.action;

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

public class LoginFormAction {
    @Action(value="loginForm")
    public String execute() {
        return "formulario-login";
    }
}

Oi Ellyson,

às vezes o plugin de convenções do Struts 2 fica meio louco... você tentou usar a anotação @Action com o value adequado e os results?

O que parece estar acontecendo é que ele não está reconhecendo que deve preencher o atributo (variável membro) usuario, da sua Action... daí o NullPointerException acontece quando o UsuarioDAO chama procura.getLogin().

Pode tentar isso?

Algum avanço, Ellyson?

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software