Migrando de VRaptor 2 para 3 - Dúvida Ajax

ok, vamos lá.

Esse é o código que eu estou tentando fazer funcionar. O que eu mudei dele do VRaptor2 para o 3 foi a URL. Com o “success” não funcionou e então eu mudei para “complete” e entrou na function. No alert do meu data aparece um XMLHttpRequest, não sei se está certo ou como faço para ler o valor dele ou como o VRaptor trata isso. Enfim, esse é o código:

var ajaxCommon = {
		lerObservacao: function(idExame) {
	
			$.ajaxJson({
					    url: '/ajax/lerObservacao/'+idExame,
					    requestHeaders: {Accept: 'application/json'},
					    dataType: 'json',
						complete: 
							function(data) {
								alert(data);
								if (data.observacao != null){
									alert("uhul");
									exibir_mensagem('Informações Clínicas',data.observacao);
								}
								else{
									alert("haha");
									exibir_mensagem('Aviso','Não existem informações cadastradas.');
								}
							}
					});
			}
}

Tentando com $.getJSON, o alert do teste me jogou um undefined na tela e o alert apareceu antes de executar o método do Controller

ajaxCommon = {
		lerObservacao: function(idExame) {
			var teste = $.getJSON("/ajax/lerObservacao/"+idExame);
			alert(teste);
		}
}

O meu método atualmente, depois de várias mudanças está assim:

	@Remotable
	@Post
	@Path("/ajax/lerObservacao/{idExame}")
	public void lerObservacao(Long idExame) {
		this.result.include("observacao", "teste");
	}

Não é assim que se gera JSon no VRaptor3! a anotação @Remotable não existe mais, a que vc tah usando provavelmente é a do vraptor2…

no vraptor 3 vc vai fazer assim:

@Post  
@Path("/ajax/lerObservacao/{idExame}")  
public void lerObservacao(Long idExame) {  
     Observacao observacao = //...
     this.result.use(Results.json()).of(observacao).serialize();
}  

assim vai funcionar… se vc quiser passar uma string mesmo vc vai ter usar isso pra poder dar um nome a ela:

this.result.use(Results.json()).of(observacao, "observacao").serialize();

O @Remotable é porque estou utilizando a compatibilidade com o VRaptor2. Mas tudo bem, isso não fez diferença.

Para mim não aparece o método “of” nessa linha:

this.result.use(Results.json()).of(observacao).serialize();  

Tentei utilizar o método from, mas continua a mesma coisa… to ficando loco já hehehe

é o método from mesmo…

tenta acessar no browser a url desse método e vê o que tá retornando…

repare que tá com @Post… muda pra @Get que talvez funcione com o $.getJSON pelo menos

Agora avançou um pouco:

	@Path("/ajax/lerObservacao/{idExame}")
	public void lerObservacao(Long idExame) {
		String observacao = new ExameDAO().get(idExame, false).getObservacao();
		this.result.include("observacao", observacao);
		this.result.use(Results.json()).from(observacao).serialize();
	}
var ajaxCommon = {
		lerObservacao: function(idExame) {
	
			$.ajaxJson({
					    url: '/ajax/lerObservacao/'+idExame,
						complete: 
							function(observacao) {
					    		alert(observacao.responseText);//AQUI APARECEU ALGO ASSIM: {"string":"teste"} como pegar só o "teste" que é o valor que eu realmente quero??
					    		alert(observacao.status);
								if(observacao.status == 200){
									if (observacao != null){
										alert("uhul");
										exibir_mensagem('Informações Clínicas',observacao.responseText);
									}
									else{
										exibir_mensagem('Aviso','Não existem informações cadastradas.');
									}
								}
							}
					});
			}
}
eval(observacao.responseText).string //==> "teste"

vc pode tb usar algo que já te dá um json… por exemplo o $.getJSON()

aí vc faria

$.getJSON(...).string

ufa… agora sim. Valeu pela ajuda!!

Aproveitando o tópico, mas sem conhecimento de causa.
As poucas vezes que utilizei ajax, tanto no VRaptor2 quanto no 3, nunca dei qualquer tratamento especial no controller.
Os dados são disponibilizados para a view da forma comum, independetente de utilizar ou não ajax.

Na view deixo desta forma:

	$.ajax({
		type:"POST",
		url:"caminho.....",
		data:"parametros...",
		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
		error: function(){
			alert('mensagem de rro!');
		},
		success: function(result){
			$("#lista").hide();
			$("#lista").append(result);
			$("#lista").fadeIn("slow");
		}
	});

Ou simplesmente:

		$('#lista').load('..caminha/parametro?' + valorPrametro); 
		$('#lista').fadeIn('slow');

Será que tenho sido muito simplista?
Ou será por que sempre utilizei apenas JQuery?

das duas formas vc tá fazendo uma requisição usando javascript, a diferença é que uma é assíncrona e outra é síncrona… mas vc pode chamar as duas formas de ajax…

Mais uma… como receber dois valores?
Por exemplo:

this.result.use(Results.json()).from("teste1","teste1").serialize();
this.result.use(Results.json()).from("teste2,"teste2").serialize();

Recebo:
{“teste1”: “teste1”}{“teste2”: “teste2”}

Como separar isso em duas variáveis no javascript?

Ou vc coloca dentro de uma lista e serializa a lista:

lista.add("teste1");
lista.add("teste2");

result.use(json()).from(lista, "teste").serialize(); 
// no javascript: var json = $.getJSON(...); json.teste[0]; json.teste[1];

ou vc cria uma classe que tem esses dois campos:

public class Testes {
   private String teste1;
   private String teste2;
   //construtor para esses dois campos
}
//...
result.use(json()).from(new Testes("teste1", "teste2")).serialize();
//no javascript: var json = $.getJSON(...); json.testes.teste1; json.testes.teste2;