Pessoal, estou usando um desss tutoriais de Spring 2 + Struts2 e estou usando Hibernate tb ! (Não quero usar Ajax).
Seguinte, tenho um jsp (index.jsp), que se campos todos ok => vai para listar.jsp.
Se campos nao ok gostaria que ficasse no index.jsp e mostrasse erros na tela.
O tutorial fala para criar um “NomeAction-salvar-validation.xml”,…
Criei e coloquei as validações do mesmo neste xml. (mais abaixo)
Ao rodar a aplicacao e mandar submeter com campos preenchidos => ok, vai para o outro jsp => SEM PROBLEMA.
Ao rodar a aplicacao e mandar submeter com campos vazios, NÃO aparecem as validacoes na tela (Campo obrigatório) e ainda cai com uma -
javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not insert… etc etc,…
COMO colocar as validações inseridas no validation.xml aparecendo na tela ???
Codigos:
JSP INDEX.JSP
(index.jsp - se ok deve ir para listar.jsp, se nao ok = deve ficar no mesmo jsp mostrando erros. No momento soh funciona se ok)
1. Por que não usa mapeamentos com annotations pelo Convention Plugin? São bem mais praticos e aumentam em muito a produtividade.
2. Parece que seu arquivo XML simplesmente está sendo Ignorado. Como os nomes dos campos no form batem com os nomes dos campos no seu XML o motivo aparente é que seu XML de validação não está no mesmo pacote da Action.
3. Onde há validação deve necessariamente haver um mapeamento de input. Ou seja, seu mapeamento de “salvar” deveria estar assim:
<action name="salvar" class="projetoAction" method="salvar">
<result type="redirect">listar</result> <!-- leia o item 5. abaixo -->
<result name="input">/paginaDoMeuFormulario.jsp</result> <!-- falta isso -->
</action>
4. Por que não usa validação pelas anotações de validação do Struts2 ou do Hibernate Validator pelo uso do Full Hibernate Plugin (http://cwiki.apache.org/S2PLUGINS/full-hibernate-plugin.html)? Este plugin inclusive faz a necessidade do uso do spring desaparecer pois injeta, fecha e “comita” as sessões e transações Hibernate automaticamente pra você usando apenas a arquitetura de Interceptors do próprio Struts2.
5. Onde você usa type=“redirect” não precisa colocar “listar.action”. Basta “listar”.
Obrigada Jose.
Sim, a validation.xml está no mesmo diretório da action.
Coloquei input, tirei o listar. action e continua NÃO FUNCIONANDO.
Simplesmente ignora.
A aplicação continua e cai porque dá erro no banco.
(Eu tento inserir sem conteúdo.) Meu teste de erro eh com os campos em branco e apenas submeto.
Ao inves de entrar na validação, ele ignora e cai ao inserir no banco.
NÃO ENTENDO PQ NAO FUNCIONA !!!
Isso funciona mesmo ???
Vou ter q voltar ao velho actionerror - adicionando mensagenzinha de erro ?!?!
Amiga, um detalhe que me chamou atenção foi o nome da sua action: “projetoAction”. É isso mesmo, com “p” minúsculo? Ou você configurou a action via spring com esse nome?
O nome do xml não pode ser só “Validation.xml”. Deve ser
projetoAction-validation.xml
(se sua action possuir só um mapeamento que exigir validação)
ou
projetoAction-salvar-validation.xml
(se sua action possuir mais de um mapeamento que exigir validação)
Que funciona, funciona, porque já usei muito esse tipo de validação antes de começar a usar validações por anotações
Porém nunca usei a validação com XML tendo mapeado as actions via Spring (até porque acho perda de tempo usar Spring no Struts2). Se for o caso, tente usar o nome da classe para o nome do XML de validação. Nesse caso os nomes seriam:
esse tutorial data de 2006 com ultima atualizacao em fev/2008. Na epoca nao havia o Full Hibernate Plugin (que evita o uso do spring e da validacao nativa do struts2) nem o Jquery Plugin (que evita o uso do ajax nativo do struts2).
Existe a linha
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
O “requiredstring” acaba nao valendo quando o o campo esta no formulario. Este validador testa se a String existe. Todavia, a string sempre existira, nem que seja uma string vazia. Deves, portanto, configurar um tamanho minimo para a string para que o validador tenha efeito.
Vale a pena investir nesse plugin, pois o trabalho fica significativamente menor porque ele abstrai o uso das sessoes e transacoes hibernate e facilita imensamente o trabalho de validacao.
Com esse plugin a validacao e sempre do lado do servidor, mas e muito rapida. Lembre-se que validacao do lado do servidor e muito mais segura.
Outras coisas no seu JSP:
Sugiro usar o Jquery Plugin ao inves do Dojo Plugin. E bem mais rapido e estavel e com mais recursos.
Minha maior preocupação eh se esse Plugin faz as validações necessárias do form na parte client ?
Porque o que me lembro do Hibn é que a validação do mesmo era na parte server…
procede ?
Sendo assim a validação do Struts (que não adianta, não consigo usar), não seria melhor ?
A única, repito, única vantagem de validações do lado do cliente é a redução no tráfego da rede.
Nem mesmo a performance é necessariamente melhor do lado do cliente.
Validações do lado do servidor são infinitamente mais seguras porém forçam a “ida e vinda” de informações pela rede.
Ok, obrigada e desculpa a chateação aí !
É que aqui na equipe de desenv, creio que não passe… a não ser que eu use algo no JS.
Aqui dizem q cada camada deve cuidar de suas validações.
Ou seja, se tenho um form, não posso submete-lo com erros, mesmo que seja uma definição de negócio.
Enfim,
Obrigada !
Quer dizer que se tiverem uma mesma camada modelo usada por um cliente swing, outro JSP e outro mobile terao que REPETIR regras de validacao em todos os 3? E mais, se uma mesma entidade consta em 5 forms, teremos que REPETIR as regras de validacao 5x?
E por isso que o lema do Hibernaete Validotor e: “DRY - Dont Repeat Yourself” (nao repita voce mesmo)
Mas, se a regra ai e essa, boa sorte.
PS: mesmo a validacao nativa do struts2 faz validacao no servidor em alguns casos, como validacao envolvendo datas, por exemplo.
Não me referi a isso, mas a algo que estou tentando resolver.
Um simples CRUD !!! (ninguém merece, rs).
Mas se o form necessita de validações, que isso seja resolvido por aí e não depois de cálculos, de considerar o negócio em si, etc…
Entendo sua posição, deve estar correta, mas acho tb esse pensamento algo a se considerar…
De qq maneira, to lascada, rs.
Não consigo MESMO colocar esse ‘bendito’ validation.xml pra aparecer no form !
Aparece somente no console do Tomcat:
SEVERE: Validation error for projeto.nome:Campo Nome é obrigatório.
O Hibernate validator eh acionado do lado do servidor, mas antes das “regras de negocio”. No caso do trabalho em conjunto com o struts2, sua validacao ocorre antes da chamada do metodo mapeado. Se nenhum erro de validacao for detectado, ai sim, seu metodo mapeado sera invocado (suas regras de negocio).