Struct 2 - apresenta erro There is no Action mapped for namespace / and action name

3 respostas
R

Estou começando no Java e decidi estudar o struct 2 Anotation, então ai vai a estrutura que estou tentando montar:

uma javabeans “usuario” na BEL;

uma classe “usuario” na DAO com persistência via hibernate;

um frontend em JPS com um formulário HTML com Jquery que executa a action incluiUsuario;

uma classe incluiUsuario na BLL.usuario que incluirá via DAO o usuário;

Bem meu problema é que fiz a classe incluiUsuario com os anotations ?Action? certinho e o form com a action apontando para incluiUsuario, mas ao apertar o botão aparece o erro: There is no Action mapped for namespace / and action name incluirUsuario

Aqui a classe Action

Aqui o form

Além do problema, ainda tenho uma dúvida:
Da forma como estou estruturando o sistema, terei uma classe para cada ?Action?, mas gostaria muito de ter uma classe para todas as ações relacionadas ao usuário.

3 Respostas

jyoshiriro

Amigo,

Você tentou usar “convenção sobre configuração” que o Struts 2.x ofereçe. Eu gosto muito desssa idéia, pois aumenta muito a produtividade e deixa o código com fácil manutenção.

Pelos códigos que você postou, parece-me que faltou:

  1. Sua Action deveria estar num pacote “action” ou “xx.yy.zz.action” (ou “actions”)

  2. O nome da Action deve começar ocm letra maiúscula (regra geral, aliás)

  3. Vocẽ incluiu o “jar” do Convention Plugin no seu classpath?

Dica 1: Evite resultados do tipo “ok”. Usando “success” você lança mão do padrão e escreve menos no final. Mas para desfrutar desse benefício plenamente, deve-se estender a ActionSupport em suas Actions (isso dá muitas vantagens, aliás). Assim você ganha a constante SUCCESS, podendo chamá-la via “ctrl+espaço”. O “ok” você pode digitar errado, afinal…

Dica 2: Nem precisava da anotação @Action. Basta sobrestrecer o método execute() que o mapeamento fica conforme o nome da tua classe (contanto que siga o que escrevi no no. 1). Se sua Action for “IncluirUsuario”, sua url será “incluir-usuario”.

Espero ter ajudado.

R

Cara fiz o que você disse e funcionou obrigado! Mas precisei colocar no namespace action. herdar a classe ActoinSupport e deixar os anotations, pois se tiro um deles a parada volta a dar o erro. rsrs

Ainda continuo com uma dúvida, pelo que percebi, terei uma classe para cada ação e todas ficarão dentro do mesmo namespace “action”… Isso em um projeto grande com muitas ações não tornará ficará bagunçado, não tem como ter uma classe com várias actions ou pelo menos um namespace para cada grupo de ações?

package romulor2.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import com.opensymphony.xwork2.ActionSupport;

public class IncluirUsuario extends ActionSupport {

	romulor2.dao.ConnectionUtil conn;
	
	public IncluirUsuario()
	{
		conn = new romulor2.dao.ConnectionUtil();
	}
	private romulor2.bel.Usuario usuario;
	
	
	@Action(value="IncluirUsuario", 
			results = {@Result(name="ok", location="/ok.jsp")}
		   )
			
	public String execute() 
	{
		conn.iniciaTransacao();
		
		new romulor2.dao.Usuario().incluirUsuario(conn.getSessao(), conn.getTransacao(), usuario);
		return SUCCESS;
	}
	
	public void setTarefa(romulor2.bel.Usuario usuario) {
		this.usuario = usuario;
	}
	public romulor2.bel.Usuario getTarefa() {
		return this.usuario;
	}
	
}
jyoshiriro

Amigo,

para que você precisasse de 0 configuração nessa Action, bastaria criar a página WEB-INF/content/incluir-usuario.jsp.
Essa página ficaria mapeada automaticamente para “success”, “error” e “input”. Se quisesse página diferente para os resultados bastaria fazer como no exemplo:
Resultado “error” -> página WEB-INF/content/incluir-usuario-error.jsp. Nesse exemplo, “success” e “input” continuariam para a página anterior.

Quanto a

A configuração de namespaces também segue o “convenção sobre configuração”:
ex:
pacote “romulo.actions” e classe “SalvarPessoa” -> mapeamento “salvar-pessoa” no namespace padrão.
pacote “romulo.actions.pessoa” e classe “Salvar” -> mapeamento “salvar” no namespace “/pessoa”.

Entendeu?

Criado 17 de agosto de 2010
Ultima resposta 17 de ago. de 2010
Respostas 3
Participantes 2