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…
L
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},
....
F
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
F
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
F
fabioebner
ou quem sabe fazer via XML, fica mais facil?? o js tbm vai add coisa no xml para qdo eu voltar dar erro??
L
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…
F
fabioebner
Entao eu so criei o ObjectId com o @Id do morphia la, e nao seto nada nele, ele auto cria o id
L
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?
F
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.
L
Lucas_Cavalcanti
o vraptor consegue consumir json, só colocar @Consumes no método, o problema é fazer o jquery fazer isso…
F
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.
F
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
L
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.
F
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?
L
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)
F
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)
F
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?
F
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?
L
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.
F
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.
L
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…
F
fabioebner
entao, nao e o dataType: "json" ??
F
fabioebner
e existe uma forma facil de fazer converter??? tem anotacao e coisas do genero?
valeu
F
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
L
Lucas_Cavalcanti
o processData tb eh bom
F
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?
L
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
F
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
F
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, …