Validator com Ajax

302 views
Skip to first unread message

Andrey Farias de Araújo

unread,
Aug 14, 2011, 5:41:33 PM8/14/11
to caelum-vraptor
Pessoal,

Eu tenho um método de alterar senha em meu sistema, mas agora há a
necesidade de torná-lo Ajax.

Uso o validator da seguinte forma:

validator.checking(new Validations() {{
that(!senha_atual.trim().isEmpty(), "erro", "senhaAtualVazia");
that(!nova_senha.trim().isEmpty(), "erro", "novaSenhaVazia");
that(!repetir_senha.trim().isEmpty(), "erro", "repetirSenhaVazia");
}});
validator.onErrorUse(Results.json()).withoutRoot().from("MENSAGEM").serialize();

E funciona perfeitamente, quando da erro, minha jsp recebe o texto
"MENSAGEM", e trato ela da forma que quiser. Tudo Ok.
Mas no caso eu preciso mostrar ao meu usuário o que deu errado (por
exemplo, o usuário esqueceu de repetir a senha), então como fazer para
retornar o que deu errado no onErrorUse, ao invés da String
"MENSAGEM"!?


Desde já agradeço por todo apoio que o pessoal sempre tem me dado aqui
para aprender VRaptor!

Lucas Cavalcanti

unread,
Aug 14, 2011, 8:40:08 PM8/14/11
to caelum-...@googlegroups.com
faça ao invés de gerar um json:

validator.onErrorSendBadRequest();

daí ele vai retornar status 400 e os erros vão estar serializados em json (se vc fez um $.getJSON por exemplo)

[]'s

2011/8/14 Andrey Farias de Araújo <and...@catta.com.br>

--
You received this message because you are subscribed to the Google Groups "caelum-vraptor" group.
To post to this group, send email to caelum-...@googlegroups.com.
To unsubscribe from this group, send email to caelum-vrapto...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/caelum-vraptor?hl=en.


Andrey Farias de Araújo

unread,
Aug 14, 2011, 11:20:58 PM8/14/11
to caelum-vraptor
Fiz da forma que você me recomendou. Deu certo

Ele gera um json.errors, daí pego essas mensagens tranquilamente.

Quando a alteração de senha da certo, faço o seguinte:
result.use(Results.json()).from("Senha atualizada com
sucesso").serialize();

Daí, posso pegar essa mensagem através do: json.string
Desta forma, só consigo distinguir no javascript uma mensagem de erro
da seguinte forma:

(...)
success: function (json) {
var lista = json.errors;
for(var i in lista) {
$('#mensagem-senha').html(lista[i].message);
}
if (json.string != null){
$('#mensagem-senha').html(json.string);
}
}

Existiria, por acaso, uma forma mais elegante de distinguir, via
javascript se a mensagem foi de erro ou de suceso?!

Obrigado!

Lucas Cavalcanti

unread,
Aug 14, 2011, 11:48:14 PM8/14/11
to caelum-...@googlegroups.com
estranho, o onErrorSendBadRequest deveria cair no error:, e não no success, já que ele retorna 400 como status

2011/8/15 Andrey Farias de Araújo <and...@catta.com.br>

Andrey Farias de Araújo

unread,
Aug 15, 2011, 12:15:23 AM8/15/11
to caelum-vraptor
É, se retornasse status 400, seria facinho de tratar, só era pegar
pelo statusCode do jQuery:

statusCode: {
400: function() { blablabla }
}

Mas estou fazendo exatamente isso que você me falou:

validator.onErrorSendBadRequest();

E ele vai como mensagem de "success".

Lucas Cavalcanti

unread,
Aug 15, 2011, 12:23:41 AM8/15/11
to caelum-...@googlegroups.com
dá uma olhada no firebug (ou algo similar) se a resposta da requisição veio 400 mesmo...

Andrey Farias de Araújo

unread,
Aug 15, 2011, 12:30:52 AM8/15/11
to caelum-vraptor
Deu code 200, cara.

Lucas Cavalcanti

unread,
Aug 15, 2011, 12:44:31 AM8/15/11
to caelum-...@googlegroups.com
vc fez alguma customização no representationResult, ou no JSONSerialization?

Lucas Cavalcanti

unread,
Aug 15, 2011, 12:52:24 AM8/15/11
to caelum-...@googlegroups.com
implementação do onErrorSendBadRequest usa isso:

método badRequest(List<> errors);

ele dá um setStatus pra bad request, talvez a gente tenha que fazer isso antes de serializar, ou usar o sendError...
pra testar vc pode sobrescrever essa classe no vraptor (classe que estende DefaultStatus, anotada com @Component, 
e override nesse método dando um response.setStatus(400) antes do super.badRequest.

2011/8/15 Lucas Cavalcanti <lucasm...@gmail.com>

Washington Botelho

unread,
Aug 17, 2011, 2:40:38 AM8/17/11
to caelum-...@googlegroups.com
Fala Lucas e Andrey,

A pouco passei pela mesma situação e durante o erro de validação o status code esta vindo como 200.
Sobrescrevi o componente e funcionou de boa setando o status antes, o que já era esperado.

Fiz um pull request aqui: https://github.com/caelum/vraptor/pull/379

Pra quem quiser sobrescrever o componente e evitar este problema é só criar a classe abaixo no projeto ou usar o próximo snapshot:

@Component
public class DefaultStatusCustom extends DefaultStatus {

    private final HttpServletResponse response;

    public DefaultStatusCustom(HttpServletResponse response, Result result, Configuration config, Proxifier proxifier, Router router) {
        super(response, result, config, proxifier, router);
        this.response = response;
    }

    @Override
    public void badRequest(List<?> errors) {
        response.setStatus(400);
        super.badRequest(errors);
    }

}


Obrigado pela ajuda Lucas.

--
Washington Botelho

http://wbotelhos.com.br
http://twitter.com/wbotelhos


2011/8/15 Lucas Cavalcanti <lucasm...@gmail.com>

Andrey Farias de Araújo

unread,
Aug 18, 2011, 9:07:50 PM8/18/11
to caelum-vraptor
Opa Lucas e Washington.

Estava viajando, voltei apenas hoje.
Obrigado mais uma vez, Washington e Lucas.

Irei tentar adicionar amanhã esta classe no meu projeto, e ver se o
problema é corrigido.

Abraços!

On 17 ago, 03:40, Washington Botelho <wbotel...@gmail.com> wrote:
> Fala Lucas e Andrey,
>
> A pouco passei pela mesma situação e durante o erro de validação o status
> code esta vindo como 200.
> Sobrescrevi o componente e funcionou de boa setando o status antes, o que já
> era esperado.
>
> Fiz um pull request aqui:https://github.com/caelum/vraptor/pull/379
>
> Pra quem quiser sobrescrever o componente e evitar este problema é só criar
> a classe abaixo no projeto ou usar o próximo snapshot:
>
> @Component
> public class DefaultStatusCustom extends DefaultStatus {
>
>     private final HttpServletResponse response;
>
>     public DefaultStatusCustom(HttpServletResponse response, Result result,
> Configuration config, Proxifier proxifier, Router router) {
>         super(response, result, config, proxifier, router);
>         this.response = response;
>     }
>
>     @Override
>     public void badRequest(List<?> errors) {
>         response.setStatus(400);
>         super.badRequest(errors);
>     }
>
> }
>
> Obrigado pela ajuda Lucas.
>
> --
> Washington Botelho
>  http://wbotelhos.com.brhttp://twitter.com/wbotelhos
>
> 2011/8/15 Lucas Cavalcanti <lucasmrtu...@gmail.com>
>
>
>
>
>
>
>
> > implementação do onErrorSendBadRequest usa isso:
>
> >https://github.com/caelum/vraptor/blob/master/vraptor-core/src/main/j...
>
> > método badRequest(List<> errors);
>
> > ele dá um setStatus pra bad request, talvez a gente tenha que fazer isso
> > antes de serializar, ou usar o sendError...
> > pra testar vc pode sobrescrever essa classe no vraptor (classe que estende
> > DefaultStatus, anotada com @Component,
> > e override nesse método dando um response.setStatus(400) antes do
> > super.badRequest.
>
> > 2011/8/15 Lucas Cavalcanti <lucasmrtu...@gmail.com>
Reply all
Reply to author
Forward
0 new messages