Listar com Struts2

Estou com um problema sério para listar com Struts 2 .

Ele gera um erro , falando que a minha action não existe.

Gerando o 404.

Segue os códigos :

TarefaDAO

package br.com.cfr.jdbc.dao;

  
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import br.com.cfr.jdbc.ConnectionFactory;
import br.com.cfr.jdbc.modelo.Tarefa;
 
public class TarefaDAO { 
     
    Connection connection; 
     
    public TarefaDAO() throws ClassNotFoundException{ 
        this.connection = new ConnectionFactory().getConnection(); 
    } 
     
    public void adiciona (Tarefa tarefa){ 
         
        String sql = "insert into tab_tar (descricao , finalizado) value(?,?)"; 
         
        try { 
            PreparedStatement stmt = connection.prepareStatement(sql); 
            stmt.setString(1, tarefa.getDescricao()); 
            stmt.setString(2, tarefa.getFinalizado());
            
             
            stmt.execute(); 
            stmt.close();                
        } catch (SQLException e){ 
            throw new RuntimeException (e); 
        } 
         
         
         
    }
 
     
 
      public List<Tarefa> lista() {
            try {
                  List<Tarefa> tarefas  = new ArrayList<Tarefa>();
                  PreparedStatement stmt = this.connection.prepareStatement("select * from tab_tar");
                  ResultSet rs = stmt.executeQuery();
                 
                  while (rs.next()){
                       
                        Tarefa tarefa = new Tarefa();
                        tarefa.setId(rs.getLong("id"));
                        tarefa.setDescricao(rs.getString("descricao"));
                        tarefa.setFinalizado(rs.getString("finalizado"));
                        
                        Calendar data = Calendar.getInstance();
        				data.setTime(rs.getDate("dataFinalizacao"));
        				tarefa.setDataFinalizacao(data);
                       
                        tarefas.add(tarefa);
                  }
                  rs.close();
                  stmt.close();
                  return tarefas;  
                 
            } catch (SQLException e) {
            	
            	throw new RuntimeException(e);
            }    
      }
 
      public void remove(Tarefa tarefa) {
           
            try {
                  PreparedStatement stmt = connection.prepareStatement("delete from tab_tar where id=?");
                  stmt.setLong(1, tarefa.getId());
                  stmt.execute();
                  stmt.close();
            } catch (SQLException e) {
                  throw new RuntimeException(e);
            }
    }

      public void altera(Tarefa tarefa){
  		
  		String sql = "update tab_tar set descricao=?, finalizado=?  where id=?";
  		
  		try {
  			PreparedStatement stmt = connection.prepareStatement(sql);
  			stmt.setString(1,tarefa.getDescricao() );
  			stmt.setString(2, tarefa.getFinalizado());
  			
  			
  			stmt.setLong(3, tarefa.getId());
  			
  			stmt.execute();
  			stmt.close();
  			
  		} catch (SQLException e) {
  			throw new RuntimeException(e);
  		}
  	}
      
           
      }

Action

package br.com.cfr.action;

import java.util.List;

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

import br.com.cfr.jdbc.dao.TarefaDAO;
import br.com.cfr.jdbc.modelo.Tarefa;


public class ListaTarefasAction {
	
	private List<Tarefa> tarefas;
	
	@Action(value="lista" , results = {
			@Result(name="ok" , location ="lista-tarefas.jsp")
	})
	
	
	public String execute() throws ClassNotFoundException {
	tarefas = new TarefaDAO().lista();
	return "ok";
	
	}
	public List<Tarefa> getTarefas() {
	return tarefas;
	}
	
}

   

	

}

e a JSP :

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>


<html>

<body>
	<a href="formulario-tarefas">Criar nova tarefa</a>
<br /> <br />
<table>
	<tr>
		<th>Id</th>
		<th>Descrição</th>	
		<th>Finalizado</th>
		<th>Data de finalização</th>
	</tr>
<c:forEach items="${tarefas}" var="tarefa" >
	<tr>
		
		<td>${tarefa.id}</td>
		<td>${tarefa.descricao}</td>
		<td>${tarefa.finalizado}</td> 
		<td><fmt:formatDate value="${tarefa.dataFinalizacao.time}" pattern="dd/MM/yyyy"/>
	</td>
		
	</tr>
	</c:forEach>
			</table>
	</body>
</html>

Se alguém souber , muito obrigado .

UP UP UP

Tentou debugar a action? Cola o erro que está vindo no console.

Então está MUITO estranho oque está acontecendo .

Ele estava dando uns erros , então eu resolvi testar algo , eu acessava http://localhost:8081/CFR/listaTarefas igual oque a apostila pede.

E sempre gerava o 500 .

Eu resolvi EXCLUIR a action e o JSP , e resolvi acessar o link ELE CONTINOU COM O MESMO ERRO.

Como pode isso acontecer???

Eu não tenho mais a action !

Segue o erro :

java.lang.RuntimeException: java.sql.SQLException: Column ‘Tarefa’ not found.
br.com.cfr.jdbc.dao.TarefaDAO.lista(TarefaDAO.java:73)
br.com.cfr.action.ListaTarefasAction.execute(ListaTarefasAction.java:20)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)

OBS: EU EXCLUI A ACTION E O JSP E SIM EU SALVEI !!

como ele pode dar erro em algo que nem existe???