Dificuldade com Struts2 [Resolvido]

Sow noob em Struts 2 e estou tentando desenvolver uma aplicação do curso fj21 da Caelum em casa

Ja testei o HelloWord básico e funcionou.

Estou usando os seguintes jars mas não tenho certeza se são todos necessários, se alguém puder dar um toque de qual é necessário fico grato

freemarker-2.3.15.jar
ognl-2.7.3.jar
struts2-core-2.1.8.1.jar
xwork-core-2.1.6.jar
struts2-convention-plugin-2.1.8.1.jar
commons-fileupload-1.2.1.jar
commons-io-1.3.2.jar
commons-logging-1.0.4.jar

O problema é quando tento disparar uma action.

31/05/2010 06:30:38 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn
WARNING: Could not find action or result
There is no Action mapped for namespace / and action name adicionaTarefa. - [unknown location]
at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:178)
at org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:61)
at org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39)
at com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:47)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:478)
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:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Unknown Source)

A minha action é a seguinte:

package br.com.caelum.tarefas.action;

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

import br.com.caelum.tarefas.jdbc.dao.TarefaDAO;
import br.com.caelum.tarefas.modelo.Tarefa;

public class AdicionaTarefaAction {
	private Tarefa tarefa;
	
	@Action(
			value = "adicionaTarefa", 
			results = {@Result(name = "ok", location = "/tarefa-adicionado.jsp")}
	)
	private String execute() {
		// TODO Auto-generated method stub
		new TarefaDAO().adiciona(this.tarefa);
		return "ok";
	}

	public Tarefa getTarefa() {
		return tarefa;
	}

	public void setTarefa(Tarefa tarefa) {
		this.tarefa = tarefa;
	}
	
}

O jsp que deveria chamar ela é o seguinte:

<%@ 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>Adiciona Tarefa</title>
	</head>
	<body>
		<form action="adicionaTarefa" method="post">
			Descrição<input type="text" name="tarefa.descricao"/>
			<input type="submit" value="Adiciona">
		</form>
	</body>
</html>

Meu web.xml é o seguinte:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>fj21-tarefas</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <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>
  
</web-app>

Não consigo entender porque o “helloword” funciona legal mas o adicionaTarefa não. Pelo erro ele parece não estar achando nada mapeado para tal action(adicionaTarefa) mas pra mim ta claro que está mapeado.
Se alguém puder me ajudar fico muito grato, vlw.

Boa tarde.
O método execute tem que ser privado mesmo?

@Action( value = "adicionaTarefa", results = {@Result(name = "ok", location = "/tarefa-adicionado.jsp")} ) private String execute() { // TODO Auto-generated method stub new TarefaDAO().adiciona(this.tarefa); return "ok"; }
Verifique se o problema esta ai?
Abraços.

Caraca. Nem tinha percebido que estava private.
Puxa vlw msm, vc abriu meus olhos =D
Ta funcionando agora. Obrigado msm :smiley:

É isso ai, no começo é complicado mas depois vai ficando mais fácil.
Abraços.

:slight_smile:

que a Caelum me desculpe, mas ta ruim essa apostila.

Para o meu funcionar tive que adicionar os seguintes .jar:

asm-3.1.jar
asm-commons-3.1.jar
commons-fileupload-1.2.2.jar
commons-io-2.0.1.jar
commons-lang-2.5.jar
commons-logging-1.1.1.jar
freemarker-2.3.16.jar
ognl-3.0.1.jar
struts2-convention-plugin-2.2.3.jar
struts2-core-2.2.3.jar
xwork-core-2.2.3.jar
javassist-3.11.0.GA.jar

ou seja, 3 .jar a mais