Amigos, estou com problema, fiz um autocomplete em JQuery que acessa uma url o vraptor faz uma verificacao e retorna um objeto (que vira json) para o Jquery, porem agora eu estou tentando passar esse JSON do js para outro metodo do vraptor e nao estou conseguindo.
$(function(){functionlog(message){$("<div/>").text(message).prependTo("#log");$("#log").scrollTop(0);}$("#product").autocomplete({source:function(request,response){$.ajax({url:"http://localhost:8080/noname/product/getProduct",type:"post",dataType:"json",data:{nmProduct:request.term},success:function(data){response($.map(data.productList,function(item){return{label:item.cdProduct._time,//name+(item.adminName1?", "+item.adminName1:"")+", "+item.countryName,value:item};}));}});},minLength:2,select:function(event,ui){product=ui.item.value;//aquieujogooui.item.valuedentrodeumavariavelcriadaforadafuncionvarproduct=null;log(ui.item?"Selected: "+ui.item.label:"Nothing selected, input was "+this.value);},open:function(){$(this).removeClass("ui-corner-all").addClass("ui-corner-top");},close:function(){$(this).removeClass("ui-corner-top").addClass("ui-corner-all");}});});
o meu retorno e o seguinte:
porem eu vi uma coisa estranha, eu estava debugando o JS e percebi que ele coloca o no final do objeto um tal de _proto conforme a imagem abaixo, dai qdo eu vou mandar esse objeto para o meu metodo ele nao chega…
Lucas_Cavalcanti
onde vc tá tentando passar o json pro controller?
esse proto é uma variável interna dos objetos javascript.
vc não pode passar só o id dele, e recarregá-lo no controller?
daí vc pode fazer:
...
data: {"product.id": product.id},
....
fabioebner
Entao e pq o mongodb entao o id nao e um id simples, ehheheh e ja tentei colocar para receber ObjectID mas tbm da erro
fabioebner
Se liga, eu conseguiria passar isso se fosse via form do jsp? eu recupero pelo Autocomplete do JQUERY mas na hora de retornar para o meu servidor eu mando Os OBJETOS via form do jsp??
se sim, vc te um exemplo??
obrigado
fabioebner
ou quem sabe fazer via XML, fica mais facil?? o js tbm vai add coisa no xml para qdo eu voltar dar erro??
Lucas_Cavalcanti
vamos lá… o que vc tá usando pra criar o seu objectId?
uma string ou um outro objeto?
a idéia é vc tentar passar pro controller o objeto dentro do objectId, e criar o objectId no servidor, ou criar um converter pra object id…
fabioebner
Entao eu so criei o ObjectId com o @Id do morphia la, e nao seto nada nele, ele auto cria o id
Lucas_Cavalcanti
se vc não fosse usar web, como vc faria pra buscar o objeto no mongo?
vc não tem como controlar algum valor desse id?
fabioebner
Entao cara eu nao conheco mto o mongo estou comecando a mexer agora, mas o ID dele eu crio como OBjectID, logo se eu quiser buscar pelo ID tenho que passar o objeto inteiro eu acho…
se nao fosse usar na web eu tenho o objeto e busco por ele, mas como e um objeto com algumas propriedades estou com problema na hora de passr como json do JScript para o vraptor.
Lucas_Cavalcanti
o vraptor consegue consumir json, só colocar @Consumes no método, o problema é fazer o jquery fazer isso…
fabioebner
Lucas, eu coloquei o @Consumes no metodo, e agora qdo eu chamo o ajax ele nem para o metodo, se eu tirar o consumes ele para no metodo mas nao chega nada.
fabioebner
Lucas, e aquela ideia que eu comentei de usar o autocomplete para recuperar o meu produto, dai fazer o JS passar para o meu form java (jsp) e via post do formulario via JSP eu mando o objeto de volta para o back…
sabe se e possivel?? se sim… tem algum exemplo?
vlw
Lucas_Cavalcanti
ainda vai cair no mesmo problema de vc não conseguir criar um ObjectId pra buscar um cara do banco.
do jeito que eu usei o mongo, eu fazia algo do tipo:
ObjectId id = new ObjectId("4f4fb323344878abced");
tanto pra salvar qto pra recuperar… funcionava bem.
fabioebner
Cara ta quase chegando la, o problema e que eu retorno o objeto para o JS, e como eu pego esse valor no JS?? hehehe no java e so eu dar um print do toString que vai, mais no javascript nao… e eu faze um loop na lista so para colocar esse valor para passar pro JS e complicado ne… tem como eu recuperar esse codigo no js?
Lucas_Cavalcanti
pra retornar o objeto pro js, vc pode fazer pelo json mesmo…
use um browser decente (tipo o firefox com firebug ou chrome) e faça console.log(id)… vai aparecer no console do firebug ou do chrome (F12 abre o console geralmente)
assim vai aparecer os dados. se não aparecer tenta console.dir(id)
fabioebner
Entao ele mostra o que esta na imagem abaixo, o problema e que eu nao consigo voltar isso ai para o server, e nao consigo pegar o id (4fba6e29701675f9306bd4f3) do objeto
só que pra isso funcionar precisa ter os setters (setInc, setMachine, etc)
fabioebner
Cara. eu pensei em fazer isso, mas o problema e que eu recebo: 5 objetos sendo q 1 e uma lista. vou ter que fazer 5x4 + Nx4, impossivel heeheheheh por isso tinha pensando em recuperar o JSon via JS e colocar no meu form, pq dai com um form Jsp eu dou um post enviando isso e recebo correto?
fabioebner
Perai, acho que eu entendi, errado, vc esta falando para eu criar o Json no JS?? e nao repassar o objeto que eu recebi do meu java, eu recebo o objeto, crio o json com os Getters e Setters e passo esse novo objeto para o meu metodo… correto?
Lucas_Cavalcanti
Fabio, o objeto java NUNCA vai pro javascript. O que vai é alguma representação dele, seja string, seja json, seja o que for.
pra passar para o servidor vc vai precisar usar alguma representação que o servidor saiba transformar em objeto de novo. Por exemplo json, ou form parameters.
fabioebner
eu sei… o que tentei falar e que o vraptor passa um JSON para o meu JS, mas eu nao consigo pegar esse JSON gerado pelo VRAPTOR e via javascript retornar ele para o JAVA, ele nao chega no meu metodo java. vou tentar fazer dessa forma que vc falou… vamos ver o que vai dar
então… é pq qdo vc usa o post do jquery e passa um objeto javascript (json) ele não passa esse objeto, ele tenta serializar pra form parameters e fica zoadão… se vc quer passar o objeto por json vc precisa mudar o content-type do post pra json, e mandar ele serializar o json mesmo… tem uma opção pra isso se eu não me engano.
Lucas_Cavalcanti
vixe… desse jeito não vai rolar mesmo… ele tenta ler os nomes dos parâmetros do ObjectID, e como ele não foi compilado com informação de debug, não dá…
talvez vc tenha que implementar isso com um converter pra ObjectID mesmo…
fabioebner
entao, nao e o dataType: "json" ??
fabioebner
e existe uma forma facil de fazer converter??? tem anotacao e coisas do genero?
valeu
fabioebner
e lucas, eu nao consigo qdo receber o Json pelo JS passar ele para form parameter? pq dai via form parameter eu consigo passar o objeto inteiro para o vraptor nao e?
brinca aí com as options possíveis…
tipo a contentType e a data mandando como string
Lucas_Cavalcanti
o processData tb eh bom
fabioebner
sim sim… entao eu recebo um JSON e jogo ele no meu form… entendeu?? eu tenho la no meu JSP o meu form, com os objetos que eu quero enviar para o BACK, dai eu faco um autocomplete, recebo via JSON do meu Vraptor, o objeto que eu quero, e na minha funcao javascript, eu seto as variaveis do meu form com o retorno
entendeu +/- a jogada?
Lucas_Cavalcanti
E assim funciona?
se vc colocar o json como uma string no form, vc vai ter que deserializar na mão no lado do servidor…
daí vc consegue fazer um converter pra ObjectId
fabioebner
bom vou tentar alguma coisa aqui… se bobiar vou criar um String dentro do meu objeto e antes de voltar parao JS eu loop a colecao e coloco o ID nesse campo, para retornar para o java depois
so tira uma ultima duvida, e possivel eu enviar no ajax mais de 1 parametro nao e? tu sabe como
valeu
fabioebner
Lucas, tira uma duvida, vc falou que ja mexeu com MongoDb…
tem mta diferenca de performance, entre eu fazer uma busca pelo @Id ObjectID Id;
tipo:
ObjectID id = new ObjectID("ff23f2ff");
ds.get(Product.class, id);
da forma que voce esta fazendo, nao vai chegar “produto” no controler, o que vai chega é “id” com os parametros que voce colocou.
Esse "produto = " não tá servindo de nada. Só você ver: var e = {w: prod = {a:1}}; console.log(JSON.stringify(e));
O resultado é: “{“w”:{“a”:1}}”, onde está o "prod = "?
Se eu digitar console.log(prod), ele está lá, porém isso não está sendo enviado pelo ajax. Se voce quer receber produto lá, deveria colocar produto.id.inc, produto.id.machine, …