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.
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:
publicvoidcarregarColecoes(HttpServletRequestrequest){/* Para ser implementado pelas subclasses */}publicActionForwardexecute(...)throwsException{carregarColecoes(request);if(mapping.getValidate()){ActionMessagesmessages=form.validate(mapping,request);if((messages!=null)&&(!messages.isEmpty())){saveErrors(request,messages);returnmapping.findForward(VALIDATION_FAILURE);}}ActionForwardforward=super.execute(mapping,form,request,response);returnforward;}
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:
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.