Não consigo pegar o retorno do Controller com JSON

Pessoal,

Segui as orientações do site do Vraptor para fazer a troca de dados entre a View e o controller. Consegui chamar o controller através do Json, o controller processa normalmente e devolver o valor através do result.use(json()), mas os dados não voltam para o Json. Alguém pode me ajudar?

Método do meu controller:

public void validaCPF(String cpf) {		
		if(dao.BuscaCpf(cpf).size()>0)
			result.use(json()).from(new Success(false)).serialize();
		else
			result.use(json()).from(new Success(true)).serialize();		
	}

Meu arquivo js que faz a chamada:

var verifica = false;
	$.getJSON($('#contexto').val(), {cpf : cpfAjax}, function(data){	
		alert('simples'+data.success[0].success);
		if(data.sucsess) verifica = true;				
	});	

O alert imprime “[objetc Object]”, mas ele não deveria imprimir: {“success”:{“success”:true}}?

Na verdade está certo, pois {“success”:{“success”:true}} é um objeto.

O alert é ruim demais para ser usado como um “debugger”. Se você estiver usando google chrome ou firefox e trocar esse alert por:

Ele vai te mostrar um objeto no console e tudo o que tem dentro dele…

Dica:
Use o withoutRoot() para deixar seu JSON mais bonito e prático:

Assim, a saída vai ser a seguinte:

Logo, para acessá-lo, vc só vai precisar fazer isso:

Rafael,

Muito obrigado pelas dicas! Ainda estou apanhando um pouco, mas com suas dicas acredito que estou no caminho!

Um abraço,

Pelo o que eu entendi dessa sua lógica, você quer verificar com ajax se o cpf digitado pelo usuário é válido, correto?

Então, existem várias formas de fazer algo nesse sentido:

  1. Se o CPF for válido, você retorna status 202 e trata no success do ajax, se não, vc retorna um status 500 e trata no error do ajax:
// JavaScript
$.ajax({
   url: $('#contexto').val(),
   data: {cpf: cpfAjax},
   success: function (){
      // Aqui vc faz alguma coisa se deu certo, como colocar um certinho verde ao lado do input.
   },
   error: function (){
      // E aqui você faz algo para indicar que deu errado, como um 'x' vermelho no input.
   }
});

// Java
public void validaCPF(String cpf) {
// Dá uma olhada no validador de CPF do Caelum Stella. Pois existe uma conta para verificar se é um cpf válido ou não (para isso que servem os dígitos)       
        if(dao.BuscaCpf(cpf).size()>0)  
            result.use(status()).badRequest("Esse CPF não é válido.");   
        else      
            result.use(status()).ok();
    }
  1. Seria legal se você informasse para o seu usuário o que deu errado.
// JavaScript
$.ajax({
   url: $('#contexto').val(),
   data: {cpf: cpfAjax},
   success: function (data){
      if (data.type == 'success')
         // coloca a mensagem de sucesso na tela.
      else
         // coloca o data.message com a mensagem de erro na tela.
   },
   error: function (){
      // E aqui você faz um erro genérico para o seu input.
   }
});

// Java
public void validaCPF(String cpf) {
      Informativo informativo = null;
      if (cpf == null)
         informativo = new Informativo("error", "Não foi possível obter o cpf.");
      if (verificaCPF(cpf))
         informativo = new Informativo("error", "Esse cpf é inválido.");
      if(dao.BuscaCpf(cpf).size()>0)  
            informativo = new Informativo("error", "Esse cpf já está sendo usado por outra pessoa.");
        else      
            informativo = new Informativo("success", "CPF Válido!");
      result.use(json()).withoutRoot().from(informativo).serialize();
    }

// Informativo
public class Informativo {
   private final String type;
   private final String message;

   public Informativo(String type, String message){
      this.type = type;
      this.message = message;
   }

// getters
}