WebWork2 validation

Tenho um form que faz um cadastro básico, porém não estou conseguindo fazer a validação funcionar, que deveria checar se dois campos do form foram preenchidos. O registro é cadastrado e a validação não ocorre :frowning:

Estou esquecendo algo (ou fiz algo errado)?

Form:

... <form name="newissue" method="post" action="AddIssue.action"> <table cellpadding="2" cellspacing="0" border="0"> <tr> <td bgcolor="#f2f2f2"> Titulo </td> <td> <input type="text" name="titulo" maxlegth="150" size="70"> #set ($tituloError = $stack.findValue("fieldErrors").get("titulo")) #if ($tituloError)  <strong style="color:red">$tituloError</strong> #end </td> </tr> ...

xwork.xml

... <interceptors> <interceptor-stack name="systemDefaultStack"> <interceptor-ref name="validationWorkflowStack"/> </interceptor-stack> </interceptors> <action name="AddIssue" class="br.com.deltatech.actions.IssueAction" method="add"> <result name="input" type="dispatcher"> <param name="location">/newissue.vm</param> </result> <result name="success" type="dispatcher"> <param name="location">/addedissue.vm</param> </result> <result name="error" type="dispatcher"> <param name="location">/newissue.vm</param> </result> </action> ...

IssueAction.java

... public String add() throws HibernateException { try { Issue issue = new Issue(projeto, getTitulo(), getDescricao()); IssueDAO dao = new IssueDAO(); dao.insert(issue); log.info("Issue adicionada"); return SUCCESS; } catch (DaoException e) { e.printStackTrace(); return ERROR; } } ...

AddIssue-validation.xml

<validators> <field name="titulo"> <field-validator type="requiredstring"> <message>Informe o título.</message> </field-validator> </field> <field name="descricao"> <field-validator type="requiredstring"> <message>Informe a descrição.</message> </field-validator> </field> </validators>

Desculpem o monte de código :oops:

Por cima … vc não aplicou a stack de interceptors na sua action, aplicou? (não nesse código, ao menos que tenha definido uma default pra todas as actions)

Se aplicou vamos continuar a busca …

De qualquer modo certifique-se de ter colocado AddIssue-validation.xml na mesma package da sua action. (e com a grafia identica a action configurada eu acho :roll: )

Hmmm…não sei nem como aplicar hehe, então acho que não fiz :stuck_out_tongue:

Sim, está na mesma package e com o nome idêntico.

tks.

Coloque dentro da tag action: <interceptor-ref name="systemDefaultStack"/>

Não funfou :roll:

Eu tinha tentado antes com <interceptor-ref name=“validation”/> e <interceptor-ref name=“defaultStack”/> tbm e nada.

[quote=“Umlauf”]Não funfou :roll:

Eu tinha tentado antes com e tbm e nada.[/quote]

poe o interceptor igual o Smota disse, e no seu arquivo .vm, invés de usar campos do html, use tags do velocity, #tag, #end, #bodytag e etc.

Valeu pela dica, ManchesteR :slight_smile: . Mas acho que descobri (em parte).

Eu estava chamando um método específico da action (add) e, portanto, não passava pelo método execute. Alterando a action pra chamar o método default (execute) e colocando o código pra inserir o registro nesse método tudo funciona direitinho :smiley:

Só tem um problema agora: ao voltar para o form, uma select cujos itens são alimentados do db (vide abaixo) vem vazia, pois ele não chama o get que retorna a List de itens :frowning: Se eu usar um result error do tipo chain, chamando a action que constrói o form (diferente da IssueAction), a select é alimentada, mas as mensagens de erro não aparecem :frowning: Alguma dica?

Select no form

&lt;select name=&quot;projetoid&quot;&gt; #foreach &#40;$projeto in $projetos&#41; &lt;option value=&quot;$projeto.projetoid&quot;&gt;$projeto.nome&lt;/option&gt; #end &lt;/select&gt;

A definição da action ficou assim:

&lt;action name=&quot;AddIssue&quot; class=&quot;br.com.deltatech.actions.IssueAction&quot;&gt; &lt;result name=&quot;input&quot; type=&quot;dispatcher&quot;&gt; &lt;param name=&quot;location&quot;&gt;/newissue.vm&lt;/param&gt; &lt;/result&gt; &lt;result name=&quot;success&quot; type=&quot;dispatcher&quot;&gt; &lt;param name=&quot;location&quot;&gt;/addedissue.vm&lt;/param&gt; &lt;/result&gt; &lt;result name=&quot;error&quot; type=&quot;dispatcher&quot;&gt; &lt;param name=&quot;location&quot;&gt;/newissue.vm&lt;/param&gt; &lt;/result&gt; &lt;interceptor-ref name=&quot;systemDefaultStack&quot;/&gt; &lt;/action&gt;

Isso quer dizer que pra cada método terei que fazer uma classe, pra que ele chame o método execute e o validation interceptor? Existe alguma forma de chamar o interceptor em um método específico que não seja o execute (no meu caso, o add())?