[RESOLVIDO] Problema Interceptors e Validation no Struts 2

Interceptors e Validation no Struts 2

Boa tarde a todos.
Estou com uma dúvida em relação a validação e o uso de interceptors.
Tenho uma página que tem somente 2 campos: código e descrição.
Fiz a configuração da validação via annotations da seguinte forma:

	@Validation()
	public class CadastroAction extends ActionSupport {
	...
	@RequiredStringValidator(type = ValidatorType.FIELD, message = "Por favor, digite o código.")
	@RegexFieldValidator(type = ValidatorType.FIELD, expression = "\\d+", message = "Por favor, digite o código utilizando somente números.")
	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	@RequiredStringValidator(type = ValidatorType.FIELD, message = "Por favor, digite a descrição.")
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	

Ok. Os campos são validados normalmente. Depois disso eu precisei cria um interceptor só para testes (já q estou só aprendendo struts 2). Mas quando eu ativo o interceptor antes da action, assim:

	<action name="cadastro">
		<interceptor-ref name="login"/>
		<result name="error">/erro.jsp</result>
		<result>/cadastro.jsp</result>
	</action>		

A validação simplesmente para de funcionar. Verifiquei que os dados chegam no request até o interceptor, mas não até a action.

Alguém sabe oque está errado?

Muito obrigado!

Eai pessoal!
Consegui resolver!

Não sei se o problema é o que eu to pensando. Se eu tiver errado, por favor me corrijam.
Parece que o struts 2 já define uma série de interceptors default que não precisam ser declarados explicitamente no strus.xml para funcionar (estão presentes quando se declara extends=“struts-default”). Isto é, você não precisa declarar:

...
	<interceptor-ref name="validation" />
	<interceptor-ref name="workflow" />
...

para a sua validação funcionar.

Mas quando você define um interceptor e poe ele na action, como eu fiz em:

	<action name="cadastro">  
		<interceptor-ref name="login"/>  
		<result name="error">/erro.jsp</result>  
		<result>/cadastro.jsp</result>  
	</action>      

ai (parece) que isso ‘sobrescreve’ a validação default do struts, isto é, só a minha validação do login esta sendo chamada. As outras não.

A solução que achei pra isso é criar uma nova pilha de interceptors, jogar o meu lá no meio e depois referenciar essa pilha.

...
	<interceptor-stack name="defaultLoginStack">
		<interceptor-ref name="servlet-config" />
		<interceptor-ref name="params" />
		<interceptor-ref name="login" />
		<interceptor-ref name="prepare" />
		<interceptor-ref name="chain" />
		<interceptor-ref name="model-driven" />
		<interceptor-ref name="fileUpload" />
		<interceptor-ref name="static-params" />
		<interceptor-ref name="params" />
		<interceptor-ref name="conversionError" />
		<interceptor-ref name="validation" />
		<interceptor-ref name="workflow" />
	</interceptor-stack>
...
	<action name="cadastro">  
		<interceptor-ref name="defaultLoginStack"/>  
		<result name="error">/erro.jsp</result>  
		<result>/cadastro.jsp</result>  
	</action>      

Eu achei essa idéia pesquisando na net e com certeza não é a melhor. Tem interceptors ai no meio que com certeza eu não preciso, tipo file-upload, prepare. Preciso pesquisar melhor.

Bom, mas funcionou.

Valeu galera! E qualquer sugestão é muito bem vinda!!

Abraços!

Vc pode usar

&lt;default-interceptor-ref name="defaultLoginStack"/&gt;

Com isso vc não precisa referenciar em todos os actions, eles já estarão lá qndo vc cria-los, como diz o nome é o default

acho que o que o rafael quis dizer é que ele não que ter que ficar utilizando todos os filtros, visto que ele não necessita de todos, não é que ele tenha que ficar chamando sempre a pilha em cada action, rafael também estava tendo o mesmo problema e resolvi da mesma forma que você, creio que seja um bug da versão, pois em nenhum lugar dizem que devemos fazer isso para utilizar validação com interceptadores.

Basta deixar o Parameters Interceptor params Sets the request parameters onto the Action.