[RESOLVIDO] VRaptor - Forma de validação

Bom tarde pessoal !

Bom eu estou desenvolvendo um projeto pequeno aonde eu faço faculdade e comecei a utilizar o VRaptor + Hibernate.
Eu gostaria de saber qual a melhor forma de validação utilizando esses dois frameworks.

Por exemplo

Quero adicionar um produto no banco.
Tenho as validações na página normalmente mas preciso validar tbm no camada de negócio, se por exemplo, existe algum produto com o mesmo nome.

Qual a melhor forma de realizar isso? Caso o usuário tenha digitado um nome que já existe deve aparecer um alert na página informando isso.
Agradeço a paciẽncia !

Abraços
Vitor Morales

Leia a documentação man! rs

O link abaixo tem tudo o q vc precisa

http://vraptor.caelum.com.br/pt/docs/validacao/

nesse caso… vc faz um ajax e verifica apenas se o nome está igual…
da pra fazer logo quando ele sai do input, instantâneo.

se vc tiver dificuldade grita que eu te dou as coordenadas

Opa!
Eu li a documentação sim… até acompanho ela.
Mas queria saber se existe modo melhor do que aquelas regras no controle.
Essa validação Ajax como é? Tem como da um exemplo ou indicar um link?
Abraços
Vitor Morales

vc pode fazer a sua!
de qualquer forma vc terá que fazer no controller… ou delegar pra uma outra camada que vai ter que retornar pro controller!
mas qual o problema de fazer no controller?

por ajax vc faria assim

vc manda o objeto e verifica no controller… vc faria + - assim

Ajax:

$("inputDoNomeDoProduto").blur(function(){

  var produto = {
      "produto.nome" : $("#idDoInput").val();
  }

  $.ajax({
    url: "produtos/valida",
    type: "POST",
    data : produto,
    dataType: "application/json",
    success : function(data){
        // faz alguma coisa se der certo
    }, 
    error : function () {
        // faz a lógica dependendo do status...
    }
  });
});
  
})

Controller:

public class ProdutoController{

    private Result result; 

    public ProdutoController(Result result){
        this.result = result;
    }

    @Get("/produtos/valida")
    public void validaProduto(Produto produto){
        //valida da forma que vc achar melhor

       //aqui tem várias formas...
       // retornar true ou false
       result.use(Results.json).from(expressãoBooleana).serialize();
     
       // ou tb se não tiver o produto devolve um status 200 
       result.nothing();

       // e se tem o nome daquele produto lança uma exceção  
    }

}

não sei se ficou muito claro pra vc… tenta aih

um jeito bom é usar as anotações do bean validations… tipo @NotNull, @NotEmpty, @Length, etc… e no VRaptor usar só:

validator.validate(objeto);

Pessoal.

Acho que esse modo vai resolver meu problema. Mas gostaria que fosse algo assim.

Ao enviar o formulário eu faço um monte de validação via javascript como se os campos estão no formato válido etc …
Gostaria uma requisição ajax que chamasse o método pra adicionar o produto e neste método tem as validações do tipo se já existe.
Caso tenha sucesso ou erro eu devo retornar uma mensagem específica pra tela e mostrar num alert por exemplo sem que seja necessário recarregar a página.

Como faria isso de um modo limpo ?
Eu implemento no .submit() do formulário umas validações javascript mesmo, mas necessito dessa lógica de validação também na camada da aplicação.

Agradeço a paciência ai !
Caso puderem dar um exemplo simples ou enviar alguma página que contenha um exemplo melhor ainda !

Abraços !

Vitor Morales

Eai vitor!

vc pode fazer por ajax msm! o exemplo que te dei funciona para o seu caso! ou não?

por exemplo… se vc quer validar se o login de um usuário já foi cadastrado… no envento onblur do seu input vc teria um evento

e nele teria uma função ajax que bateria no controller e o controller te retornaria uma resposta de que achou ou não esse nome no banco! ou qualquer outra lógica de validação que vc precisar!

qual o problema que vc está tendo?

É mais ou menos isso …
Mas como eu faço pra retornar um mensagem de erro do controlador pra página ?

Do tipo … dentro do método de adição possui alguns validações e pra cada validação eu preciso retornar uma mensagem diferente.

Como faço isso ?

e eu tenho essas validações javascript que não foram feitas por mim … como integraria isso dentro da função ajax submit ?

$('#newNetworkForm').submit(function() {         
         
        //Validações antes de executar o comando final
        if($("#nomeRede").val() == ""){            
            $('#nomeRede').css('border','red solid 1px');
            alert("Digite um nome");
            $('#nomeRede').focus();
            return false;
        }
        else
        if($("#localRede").val() == ""){
            
            $('#localRede').css('border','red solid 1px');
            alert("Digite um Local");
            $('#localRede').focus();
            return false;
        }
        else
        if($("#ipRede").val() == ""){
            
            $('#ipRede').css('border','red solid 1px');
            alert("Digite um IP");
            $('#ipRede').focus();
            return false;
        }
        else
        if($("#mascaraRede").val() == ""){
            
            $('#mascaraRede').css('border','red solid 1px');
            alert("Digite uma Máscara");
            $('#mascaraRede').focus();
            return false;
        }
        else
        //Validação de Ip e Mask
        if(validarIP($("#ipRede").val()) == false){
            
            alert("Digite um IP válido");
            $("#ipRede").val("");
            $("#ipRede").focus();
            return false;
        }
        else
        if(validarIP($("#mascaraRede").val()) == false){
            
            alert("Digite uma Máscara válida");
            $("#mascaraRede").val("");
            $("#mascaraRede").focus();
            return false;
        }
        else
        if((validarIP($("#gatewayRede").val()) == false))
        {
            alert("Digite um Gateway válido.");
            $("#gatewayRede").val("");
            $("#gatewayRede").focus();
            return false;
            
        }
    
        $("#ipRede").val(ip2long($("#ipRede").val()));        
        $("#mascaraRede").val(ip2long($("#mascaraRede").val()));       
        $("#gatewayRede").val(ip2long($("#gatewayRede").val()));
        
        
    });

Sem que eu precise redirecionar ou recarregar a página até pq a navegação tbm ta via ajax.
Ao clicar num item do menu ele carregar uma outra página dentro de um div na página principal

se vc quiser fazer isso batendo no servidor, vc pode fazer algo do tipo:

@Get("/bla")
public void valida(Objeto objeto) {
  validator.validate(objeto);
  validator.onErrorSendBadRequest();
  result.nothing();
}

daí vc pode fazer no javascript, antes do submit:

$.getJSON('.../bla').success(function() { form.submit() }).error(function(errors) {
   //mostra os erros
});

ah… use o jquery validator, é melhor.

Estou tentando da forma que foi passada ali via ajax

Mas me parece que tem algum erro na função. Alguma idéia ?
O método no controlador não está sendo chamado. O blur funciona se tirar o método $.ajax

Acho que aquilo lá resolve mesmo.

Resolvi

    
    $("#nomeRede").blur(function(){  
        alert("Blur");        
        
        $.ajax({  
            url: '<c:url value="/network/validate"/>',  
            type: "POST",  
            data : {
                p: $("#nomeRede").val()
            }, 
            dataType: "application/json",  
            success : function(data){  
                alert("ok");
            },   
            error : function () {  
                alert("erro");  
            }
        });  
       

Vou tentar fazer o que tinha imaginado aqui e respondo.

Vlw pessoal.

Ainda assim o método no controlador não foi chamado … o que pode ser ?
Ele sempre caio no caso de error do ajax;

Resolvi retirando o @Get do método e colocando @Path

é por causa do type: “POST”, … só trocar pra GET

Como faço pra retornar um texto no caso de erro pra função pra poder imprimir isso no alert?

Do tipo “Nome de rede existente”.

se vc usar o esquema do validator.onErrorSendBadRequest(), só adicionar uma validação antes disso:

if (alguma coisa)
  validator.add(new ValidationMessage("Nome de rede existente", "algo"));

isso vai estar disponível na função de success.

e como é esse esquema do validator.onErrorSendBadRequest() ?
hahaha

o que eu tinha falado numa msg anterior:

http://www.guj.com.br/java/293030-vraptor---forma-de-validacao#1558899

Eu mudei tudo.

Não consegui fazer da forma que eu queria.

O meu formulário agora envio via ajax e faço as validações dentro do metodo addNetwork.
Mas como eu retorno uma mensagem de erro dessa forma pra ser exibido no error: do ajax ?