Interceptors com Annotation no Struts2 - Action perde acesso ao bean do JSP [RESOLVIDO]

3 respostas
Rangel_Zutin

Pessoal,

estou com um problema ao usar Interceptors do Struts2. Quando associo minha Action ao Interceptor atraves da annotation interceptorRefs = {@InterceptorRef("authorizer")} minha Action nao consegue mais ter acesso ao Javabean do JSP. Seguem os codigos:

Action:

@ParentPackage("default")
package uk.co.rangel.tasks.action;

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

import uk.co.rangel.dao.TaskDAO;
import uk.co.rangel.tasks.model.Task;

@ParentPackage("default")
public class AddTaskAction {
	
	private Task task;
		
	@Action(value="addTask", 
			results={@Result(name="OK", type="redirectAction", params={"ActionName", "listTasks"})},
			interceptorRefs = {@InterceptorRef("authorizer")})
	public String execute(){
		new TaskDAO().addTask(this.task);
		return "OK";
	}

	public Task getTask() {
		return task;
	}

	public void setTask(Task task) {
		this.task = task;
	}
}
}

Interceptor:

public class AuthorizerInterceptor implements Interceptor {

	private static final long serialVersionUID = -8924888461901666436L;

	@Override
	public void destroy() {
	}

	@Override
	public void init() {
	}

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		Login login = (Login) invocation.getInvocationContext().getSession().get("loginSession");
		if(login == null){
			return "FAIL";
		} else {
			return invocation.invoke();
		}
	}

}

struts.xml:

<struts>
	<include file="struts-default.xml"/> 
	<package name="default" extends="struts-default">
		<interceptors>
			<interceptor name="authorizer" class="uk.co.rangel.tasks.interceptor.AuthorizerInterceptor"/>
		</interceptors>
		
		<global-results>
			<result name="FAIL">/jsp/login.jsp</result>	
		</global-results>
	</package>
</struts>

Form JSP:

<form action="addTask" method="post">
<table width="800">
<tr>
<td>Description:</td>
<td><textarea name="task.description" rows="5" cols="100"></textarea></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="SAVE"/></td>
</tr>
</table>
</form>

Agredeco desde ja a ajuda de todos!

3 Respostas

jyoshiriro

Amigo, acredito que esteja depreciado o uso de Interceptors como você fez.

Faça sua classe estender AbstractInterceptor ao invés de implementar a Interface que você usou.

Uma dica:

Seu código:

@Action(value="addTask", // não precisa indicar o "value" caso assuma o mesmo prefixo do nome da classe results={@Result(name="OK", type="redirectAction", params={"ActionName", "listTasks"})}, // Por que "OK" ao invés do SUCCESS? ; "ActionName" está errado!; não precisa chaves quando é só 1 interceptorRefs = {@InterceptorRef("authorizer")}) // não precisa chaves quando é só 1

Poderia ficar:

@Action( results=@Result(type="redirectAction", params={"actionName", "listTasks"}), interceptorRefs = @InterceptorRef("authorizer"))
Dai o seu método retorna SUCCESS (valor constante) e não “OK”. Mas sua Action precisaria estender ActionSupport (acredite, isso traz MUUUUUITAS vantagens!).

Outra dica:
Não precisa de no seu struts.xml.
Isso é feito automaticamente pelo Struts 2 já.

Adriano_Almeida

A parte de interceptors do Struts2 quando vc trabalha com as anotações é algo bem feio. De qualquer forma Rangel, vc precisa declarar que a sua Action precisa passar pela stack de interceptors do Struts. Pra isso basta adicionar no atributo interceptorRefs a anotação @InterceptorRef(“defaultStack”).

Aí ficaria:

@Action(value="addTask",   
            results={@Result(name="OK", type="redirectAction", params={"ActionName", "listTasks"})},  
            interceptorRefs = {@InterceptorRef("authorizer"), @InterceptorRef("defaultStack")})

Teste ae e qlqr coisa avise.

[]'s

Rangel_Zutin

Muito obrigado pela ajuda amigos. Resolveram meu problema!

Criado 6 de junho de 2010
Ultima resposta 6 de jun. de 2010
Respostas 3
Participantes 3