Struts - problemas no uso do Validator

5 respostas
bonfarj

Pessoal, to tentando usar o Validator do Struts mas ta dificil… fiz inumeros testes mas nao consigo de jeito nenhum… devo ta fazendo

alguma besteira… antes de relatar como testei, algumas observacoes:

  • Uso LookupDispatchAction ao inves de Action
  • Uso Tiles

Vamos la:

1 - Modifiquei minha a classe ClienteForm, deixou de extender ActionForm para extender ValidatorForm

...

public class ClienteForm extends ValidatorForm {
 
	private static final long serialVersionUID = -8629802068859556198L;
	private String nome;
	//outros atributos

	//getters e setters

	//nada mais!

}

2 - No struts-config.xml…

<struts-config>
	...

	<form-beans>

	...
		<form-bean name="ClienteForm" type="br.com.nomus.visao.form.ClienteForm" />

	...
	
	</form-beans>
	
	...
	
	<global-forwards>
	
	...
	
		<forward name="/cliente"  path="/Cliente.do?metodo=Empty"/>
	
	...
	
	</global-forwards>
	
		...
	
	<action-mappings>
	
	...
	
		<action path="/Cliente" parameter="metodo"
				type="br.com.nomus.visao.action.ClienteAction"
				name="ClienteForm"
				scope="request">
			<forward name="cadClientes" path=".cliente" />
		</action>
	
	...
	
	</action-mappings>
	
	...
	
	<controller processorClass="org.apache.struts.tiles.TilesRequestProcessor"
			bufferSize="4096"/>
	
	...
	
	<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
		<set-property property="pathnames"
				value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
	</plug-in>
		
	<plug-in className="org.apache.struts.tiles.TilesPlugin">
		<set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml" />
	</plug-in>
</struts-config>

3 - no tiles-defs.xml…

<tiles-definitions>

	<definition name=".paginaPessoal" path="/pages/common/layout.jsp">
        	...
	</definition>

        	...

	<definition name=".cliente" extends=".paginaPessoal">
        	<put name="corpo" value="/pages/EDCliente.jsp"/>
	</definition>
</tiles-definitions>

4 - validator-rules.xml sem modificacoes

5 - validation.xml

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE form-validation PUBLIC
          "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
          "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">

<form-validation>
    <formset>
        <form name="ClienteForm">
            <field property="nome" depends="required">
				<arg0 key="ClienteForm.nome"/>
            </field>
        </form>
    </formset>
</form-validation>

6 - No .properties…

ClienteForm.nome = Nome
errors.required = o campo {0} é requerido.

7 - Feito isso, em Cliente Action (que extende LookupDispatchAction) eu uso o seguinte codigo:

ActionMessages erros = clientesForm.validate(mapping,request);
saveErrors(request, erros);

testei o método sem preencher o campo “nome”, mas após rodar o validate(), “erros” fica null :frowning:

alguem sabe oq tem de errado??

valeu pessoal!!

5 Respostas

A

Procure alterar essa sua linha de codigo para essa aqui !

Sua linha:

ActionMessages erros = clientesForm.validate(mapping,request);
saveErrors(request, erros);

Alteração:

ActionMessages messages = new ActionMessages ();

messages.add("sua String de msg de erro", new ActionMessage(mensagemDeErro));
saveErrors(request, messages);

Espero que resolva

falo

bonfarj

funcionar funciona, mas dessa forma eu não farei uso do Validator, o meu objetivo. :cry:

mas de qualquer forna valeu, se souber de alguma coisa… :smiley:

J

Não está faltando alguma coisa lá na action do struts-config.xml não?

Olha o exemlo que tenho num projeto aqui:

<action name="ConsultarInstrucoesForm" path="/consultarInstrucoes" parameter="dscAcao" type="br.com.meuprojeto.controller.actions.empresa.InstrucoesActions" validate="true" input="telaMsgErro" scope="session" > <forward name="sucesso" path="/htdocs/programas/empresa/tela1.jsp" contextRelative="true" /> <forward name="falha" path="/htdocs/tela2.jsp" contextRelative="true" /> </action>

Onde a telaMsgErro é um global forward:

<forward name="telaMsgErro" path="/htdocs/telaErro.jsp" contextRelative="true"/>
bonfarj

Oi julianostr!

eu adaptei o codigo que vc postou mas nao funcionou, nao sei se é pq usamos Tiles aqui… nos nossos global-forwards passamos uma Action (path="/Cliente.do?metodo=Empty") ao inves de uma jsp, nao sei se tem a ver.

Eu baixei o código fonte do Struts para fazer o debug, mas fiquei preso na parte que ele usa o método Validator.validate(), por não ter o jar com o fonte do do commons-validator aqui, não sei qual a versão que o Struts 1.2.6 usa… o ValidatorForm.validate() é assim:

public ActionErrors validate(ActionMapping mapping,
                                 HttpServletRequest request) {

        ServletContext application = getServlet().getServletContext();
        ActionErrors errors = new ActionErrors();

        String validationKey = getValidationKey(mapping, request);

        Validator validator = Resources.initValidator(validationKey,
                             this,
                             application, request,
                             errors, page);

        try {
            validatorResults = validator.validate();
        } catch (ValidatorException e) {
            log.error(e.getMessage(), e);
        }

        return errors;
    }

o meu sistema ta entrando no catch, ele gera o seguinte erro:

21/06/2006 17:15:06 org.apache.struts.validator.ValidatorForm validate
SEVERE: org.apache.struts.validator.FieldChecks.validateRequired(java.lang.Object, org.apache.commons.validator.ValidatorAction, org.apache.commons.validator.Field, org.apache.struts.action.ActionMessages, javax.servlet.http.HttpServletRequest)
org.apache.commons.validator.ValidatorException: org.apache.struts.validator.FieldChecks.validateRequired(java.lang.Object, org.apache.commons.validator.ValidatorAction, org.apache.commons.validator.Field, org.apache.struts.action.ActionMessages, javax.servlet.http.HttpServletRequest)
	at org.apache.commons.validator.ValidatorAction.loadValidationMethod(ValidatorAction.java:627)
	at org.apache.commons.validator.ValidatorAction.executeValidationMethod(ValidatorAction.java:557)
	at org.apache.commons.validator.Field.validateForRule(Field.java:827)
	at org.apache.commons.validator.Field.validate(Field.java:906)
	at org.apache.commons.validator.Form.validate(Form.java:174)
	at org.apache.commons.validator.Validator.validate(Validator.java:367)
	at org.apache.struts.validator.ValidatorForm.validate(ValidatorForm.java:110)
	at org.apache.struts.action.RequestProcessor.processValidate(RequestProcessor.java:950)
	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:207)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
	at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
	at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
	at java.lang.Thread.run(Thread.java:595)
21/06/2006 17:15:06 org.apache.struts.validator.ValidatorForm validate
SEVERE: org.apache.struts.validator.FieldChecks.validateRequired(java.lang.Object, org.apache.commons.validator.ValidatorAction, org.apache.commons.validator.Field, org.apache.struts.action.ActionMessages, javax.servlet.http.HttpServletRequest)
org.apache.commons.validator.ValidatorException: org.apache.struts.validator.FieldChecks.validateRequired(java.lang.Object, org.apache.commons.validator.ValidatorAction, org.apache.commons.validator.Field, org.apache.struts.action.ActionMessages, javax.servlet.http.HttpServletRequest)
	at org.apache.commons.validator.ValidatorAction.loadValidationMethod(ValidatorAction.java:627)
	at org.apache.commons.validator.ValidatorAction.executeValidationMethod(ValidatorAction.java:557)
	at org.apache.commons.validator.Field.validateForRule(Field.java:827)
	at org.apache.commons.validator.Field.validate(Field.java:906)
	at org.apache.commons.validator.Form.validate(Form.java:174)
	at org.apache.commons.validator.Validator.validate(Validator.java:367)
	at org.apache.struts.validator.ValidatorForm.validate(ValidatorForm.java:110)
	at br.com.nomus.visao.action.ClienteAction.inserir(ClienteAction.java:77)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:585)
	at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:270)
	at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:187)
	at org.apache.struts.actions.LookupDispatchAction.execute(LookupDispatchAction.java:150)
	at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
	at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
	at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
	at java.lang.Thread.run(Thread.java:595)
Hibernate: select cliente0_.id as id, cliente0_.nome as nome0_, cliente0_.areaAtuacao as areaAtua3_0_, cliente0_.ativo as ativo0_ from cliente cliente0_ order by cliente0_.nome

alguém sabe o que pode ser? :smiley:

bonfarj

achei a solucao no forum da sun (http://forum.java.sun.com/thread.jspa?threadID=662374&messageID=3882932), parece que o meu validator-rules.xml estava corrompido… coloquei o arquivo q vem na lib do struts 1.2.9 e funfou :smiley:

valeu pessoal!

Criado 21 de junho de 2006
Ultima resposta 23 de jun. de 2006
Respostas 5
Participantes 3