Problemas com validação

2 respostas
albinati

Pessoal, tenho um probleminha com o validator do struts que é o seguinte:
A partir de uma action e dos dados preenchidos do meu FORM, gero listas necessárias para a exibição em “combos” no meu JSP. Quando faço alguma alteração em um campo, faço um submit() com os dados que vão para o meu form, e são passados para minha action que gera novas listas para meu jsp.

O problema é que, quando minha página nao passa pelo validator, minha execução não passa pela Action e volta para o reset; assim, não carrego minhas listas e perco o ultimo do meu form. As listas não são mantidas no form, mas no “request”.

A pergunta é: como faço para recuperar minhas listas, já que não passo pela Action? Detalhe que não posso preenchê-las no meu reset(), pois além delas dependerem de dados que são preenchidos no populate() do struts, encapsulam lógica de negoócios EJB.

2 Respostas

brunocosta

Olá,

Já me deparei com esse problema, só vejo duas soluções:
Ou você põe as listas na HttpSession ou executa a validação "manualmente", dentro da action.
Eu utilizo a segunda solução da seguinte maneira: Criei uma classe que estende a implementação de Action que nós utilizamos (LookupDispatchAction) e fiz um override no método execute, que ficou parecido com isso:

public void carregarColecoes(HttpServletRequest request) {
		/* Para ser implementado pelas subclasses */
	}

	public ActionForward execute(...) throws Exception {

		carregarColecoes(request);

		if (mapping.getValidate()) {
			ActionMessages messages = form.validate(mapping, request);

			if ((messages != null) && (!messages.isEmpty())) {
				saveErrors(request, messages);

				return mapping.findForward(VALIDATION_FAILURE);
			}
		}

		ActionForward forward = super.execute(mapping, form, request, response);

		return forward;
	}

Assim, todas as minhas actions herdam dessa "BaseAction".
Por padrão o RequestProcessor é quem trata de executar o método validate, então vc tem que criar uma subclasse dele pra fazer com que ele não execute a validação... mais informações sobre isso você pode encontrar aqui:

http://www.onjava.com/pub/a/onjava/2004/11/10/ExtendingStruts.html

Talvez alguma outra solução pra este problema possa ser possível através do próprio RequestProcessor, mas como a que eu utilizei acima funcionou pra mim (e eu a uso para outras coisas), eu preferi deixar assim.

Espero ter ajudado,

albinati

Opa Bruno, valeu a dica. Usei uma solução parecida: também faço a validação na minha action, porém não fiz o override do método execute, mas em um método dentro da action já que preciso manter minha collection apenas para uma função do jsp.

Mesmo assim, achei sua solução mais elegante :wink:

[]s

Criado 19 de julho de 2005
Ultima resposta 20 de jul. de 2005
Respostas 2
Participantes 2