VRaptor + JQuery + JSON = Erro

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.

alguem pode me dar um help??

valeu

Não sei se tem alguma coisa mas o meu objeto java e o seguinte:

package com.noname.entity;

import org.bson.types.ObjectId;

import com.google.code.morphia.annotations.Entity;
import com.google.code.morphia.annotations.Id;
import com.google.code.morphia.annotations.Indexed;
import com.google.code.morphia.utils.IndexDirection;

@Entity("product")
public class Product {

	@Id
	private ObjectId	cdProduct;
	@Indexed(value = IndexDirection.ASC, name="nmProductIndex")
	private String nmProduct;
	
	public ObjectId getCdProduct() {
		return cdProduct;
	}
	public void setCdProduct(ObjectId cdProduct) {
		this.cdProduct = cdProduct;
	}
	public String getNmProduct() {
		return nmProduct;
	}
	public void setNmProduct(String nmProduct) {
		this.nmProduct = nmProduct;
	}
	
	
	
}

o meu metodo e o seguinte que retorna para o autocomplete e o seguinte:

	@Post
	@Get
	@Path("/product/getProduct")
	public void getProduct(String nmProduct) throws Exception{
		abreConexao();
		List<Product> productList = ds.createQuery(Product.class).field("nmProduct").containsIgnoreCase(nmProduct).asList();
		result.use(json()).from(productList, "productList").include("cdProduct").serialize();
	}

Segue o metodo do autocomplete:

$(function() {
	function log( 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; //aqui eu jogo o ui.item.value dentro de uma variavel criada fora da funcion var product = 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…

onde vc tá tentando passar o json pro controller?

esse proto é uma variável interna dos objetos javascript.

ja tentei de todas as formas, essa e uma:

$.ajax({
		type: "post",
		data: product,
		dataType: "json",
    	  url: 'http://localhost:8080/noname/productStore/addProductStore',
    	  success: function(data) {
    	    $('.result').html(data);
    	    alert('Load was performed.');
    	  }
    	});

vc precisa passar o produto inteiro mesmo?

vc não pode passar só o id dele, e recarregá-lo no controller?

daí vc pode fazer:

...
data: {"product.id": product.id},
....

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 :frowning:

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

ou quem sabe fazer via XML, fica mais facil?? o js tbm vai add coisa no xml para qdo eu voltar dar erro??

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…

Entao eu so criei o ObjectId com o @Id do morphia la, e nao seto nada nele, ele auto cria o id

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?

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.

o vraptor consegue consumir json, só colocar @Consumes no método, o problema é fazer o jquery fazer isso…

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.

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

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.

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?

pra retornar o objeto pro js, vc pode fazer pelo json mesmo…

result.use(json()).from(id, "id").serialize();

daí vc consegue fazer usando o JQuery:

$.getJSON("....url...", function(json) {
     var id = json.id;

     alert(id);
}

Entao pra mim ele imprime no JS [object object]

então veio algo :wink:

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)