Validação no WebWork (AGAIN)

7 respostas
eduardo_lopes

E ai pessoal, estou aqui numa luta com o WW (matando cada vez menos focas :slight_smile: ), se eu conseguir essa validação aqui na empresa ninguém mais mata focas, eu prometo.

É o seguinte, preciso de validações simples, não estou utilizando forms, apenas links com parametros, só preciso que os parametros sejam obrigatórios e no formato numérico. Abaixo seguem os meus arquivos pertinentes a questão, resumindo, tenho um field na minha action chamado “culturaId”, esse campo será utilizado para uma pesquisa ele deve ser numérico e é um field obrigatório. O que está acontecendo é que se eu passar uma letra ou omitir o field na chamada da action me dá um stacktrace e não encaminha para o result “input” :?

ListProdutos-validation.xml

<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">
<validators>
    <field name="culturaId">
        <field-validator type="int">
            <message>O campo culturaId deve ser um número inteiro</message>
        </field-validator>
    </field>
    <field name="culturaId">
    	<field-validator type="required">
    		<message>O campo culturaId é obrigatório</message>
    	</field-validator>
    </field>
</validators>

xwork.xml

...
	<interceptors>
		<interceptor-stack name="systemDefaultStack">
			<interceptor-ref name="model-driven"/>
			<interceptor-ref name="component"/>
			<interceptor-ref name="validationWorkflowStack"/>
		</interceptor-stack>
	</interceptors>
...
		<action 
			name="listProdutos" 
			class="br.com.coodetec.radar.comercial.controller.ww.action.ListProdutosAction">
			<result 
				name="success" 
				type="velocity">produto0000.vm</result>
			<result
				name="error"
				type="velocity">errorPage.vm</result>
			<result
				name="input"
				type="velocity">errorPage.vm</result>			
		</action>
...

7 Respostas

eduardo_lopes

po, resolvi fazendo um if para os parametros, verificando se eles eram nulos, daí fazendo um “return INPUT;”, é assim mesmo? se eu tenho que fazer a validação dentro da action, pq dos xml’s? :cry:

Lucas_Teixeira

Ué, não vi você agregar a tua pilha na action, nem como default para o package… Você fez isto?

eduardo_lopes

enviei 2 vezes.

eduardo_lopes

Desculpe lucas, mas não entendi, veja como esta o meu xwork.xml:

<xwork>
	<include file="webwork-default.xml" />	
	
	<!-- Configuration for the default package. -->
	<package name="default" extends="webwork-default">
	
		
	<interceptors>
		<interceptor-stack name="systemDefaultStack">
			<interceptor-ref name="model-driven"/>
			<interceptor-ref name="component"/>
			<interceptor-ref name="validationWorkflowStack"/>
		</interceptor-stack>
	</interceptors>
	
	<!-- Default interceptor stack. -->
	<default-interceptor-ref name="defaultStack" />		
	
		
		<action 
			name="listProdutos" 
			class="br.com.coodetec.radar.comercial.controller.ww.action.ListProdutosAction">
			<result 
				name="success" 
				type="velocity">produto0000.vm</result>
			<result
				name="error"
				type="velocity">errorPage.vm</result>
			<result
				name="input"
				type="velocity">errorPage.vm</result>			
		</action>
		
	</package>
</xwork>
Lucas_Teixeira

E ai Eduardo,

É o seguinte cara… Para você usar o recurso de validação do webwork, você tem que definir que a tua action será interceptada pelo interceptor de validação, sacou?

Você pode fazer isso usando a validationWorkflowStack, e realmente fez adicionando ela à tua systemDefaultStack, porém você não vinculou a tua action à esta pilha de interceptors, entendeu?

O que você pode fazer? Primeiro, é adicionar essa referencia da pilha à declaração de tua action desta maneira:

&lt;action name="listProdutos" class="br.com.coodetec.radar.comercial.controller.ww.action.ListProdutosAction"&gt; &lt;interceptor-ref name="systemDefaultStack"/&gt; &lt;result name="success" type="velocity"&gt;produto0000.vm&lt;/result&gt; &lt;result name="error" type="velocity"&gt;errorPage.vm&lt;/result&gt; &lt;result name="input" type="velocity"&gt;errorPage.vm&lt;/result&gt; &lt;/action&gt;

Mas pode ser que essa pilha seja a default para TODAS as actions DESTE PACKAGE (não é herdada esta configuração para packages que o extendem). Se você quiser então que ela seja a default, desconsidere a alteração acima e substitua:

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

por

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

Entendeu? (;

eduardo_lopes

blza Lucas, entendi o que vc disse e vi onde estava errando, porém ainda não obtive sucesso, para tanto fiz um mini-teste, veja só.

obs: to muito empolgado com esse framework, muito mais produtivo q struts, mas to apanhando um pouco da validação, ainda q não cheguei em javascript!

eduardo_lopes

to chegando lá, estou com esse erro nos logs do tomcat, isso aparece se eu tentar fazer uma validação “requiredstring” também. alguma luz?

SEVERE: Caught exception while loading file br/com/coodetec/radar/comercial/controller/ww/action/PessoaAction-validation.xml
java.lang.IllegalArgumentException: There is no validator class mapped to the name email
Criado 16 de junho de 2005
Ultima resposta 17 de jun. de 2005
Respostas 7
Participantes 2