Vraptor - Erro: id to load is required for loading

Fala galera, to tentando preencher todos os campos do meu formulario ao colocar o id em um campo da tela. Mas estou com esse erro ai. Alguma luz?

Controller

	@Get("/produtos/buscaid")
	public Produto busca(Long id){
		result.include("id",id);
		return pdao.busca(id);
	}

	@Get("/produtos/buscaid.json")
	public void buscaidJson(Long q){
		result.use(json()).withoutRoot()
			.from(pdao.busca(q))
			.include("categoria") //um produto contem uma categoria
			.serialize();
	}

formulario

$('#buscaid').blur(function(){
			alert("to no blur");
			$.ajax({
				url: '<c:url value="/produtos/buscaid.json"/>',
				type: 'GET',
				data: $('#buscaid').val(),
				dataType: 'json',
				success: function (produto){
					alert('entrei no success');
					$('#id').val(produto.id);
					$('#nome').val(produto.nome);
					$('#descricao').val(produto.descricao);
					$('#preco').val(produto.preco);
					$('#categoria_id').val(produto.categoria.id_categoria);
					$('#categoria').val(produto.categoria.descricao);
					
					$('#buscanome').focus();
				}
			});
		});

erro

Obrigado pra qm ajudar :slight_smile:

Acontece alguma exception?

Aonde que essa exception ocorre?

Por que que você faz um include do ID se depois você vai retornar um produto (que tem um getID() com o id que você precisa)??

-EDIT-
Cadê o “Caused by:” dessa exception?

Debuga para ver se o ID não está indo NULL.

[quote=Rafael Guerreiro]Acontece alguma exception?

Aonde que essa exception ocorre?

Por que que você faz um include do ID se depois você vai retornar um produto (que tem um getID() com o id que você precisa)??

-EDIT-
Cadê o “Caused by:” dessa exception?

Debuga para ver se o ID não está indo NULL.[/quote]

entao velho, o erro ocorre qnd eu coloco o codigo no campo de busca por id e o focus sai dele.
O Caused By: ta ai:

Caused by: java.lang.IllegalArgumentException: id to load is required for loading at org.hibernate.event.LoadEvent.&lt;init&gt;(LoadEvent.java:89) at org.hibernate.event.LoadEvent.&lt;init&gt;(LoadEvent.java:61) at org.hibernate.impl.SessionImpl.load(SessionImpl.java:982) at org.hibernate.impl.SessionImpl.load(SessionImpl.java:978) at br.com.goodbuy.dao.ProdutoDao.busca(ProdutoDao.java:44) at br.com.goodbuy.controller.ProdutosController.buscaidJson(ProdutosController.java:115) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61) ... 43 more

Continuo sem entender…

o método no dao é esse:

Dao:

	public Produto busca(Long id) {
		return (Produto) this.session.load(Produto.class, id);
	}

troca essa linha do seu ajax:

para:

Valeu velho, funcionou aqui. Você é o cara :smiley:
Obrigado mesmo.
Agora só esclarecendo, eu preciso sempre colocar ai a variavel q eu to usando no metodo do json? No caso o ‘q’.

Na verdade, o problema é que quando você vai passar uma variável para a sua action (não importa se é ajax ou não) você precisa passar o nome e seu respectivo valor…

Ou seja, quando você vai usar um form para passar o nome através de um input, voce faz algo assim:

Quando você vai passar pela URL (via parâmetros do get) você faz assim:
http://www.seuSite.com.br/SeuProjeto/suaAction?nomeDaSuaVariavelAqui=Valor%20Aqui!
E quando você vai passar via ajax, você precisa enviar um objeto javascript que contem o nome da sua variavel:

{
   'nomeDaSuaVariavelAqui':'Valor Aqui!',
   'outraVariavel':'Outro valor'
}

Saquei velho, obrigado.
Aproveitando novamente a deixa. To tentando mostrar uma mensagem na tela qnd o produto nao é encontrado. Como eu faço isso?

Então, nesse caso você pode criar uma classe que vai retornar a mensagem:

[code]public class Message {
private final int code;
private final String message;

public Message (int code, String message){
if (message == null || message.trim().length < 1) // Pode colocar essa verificação em um método estático e sair usando sempre que precisar.
throw new IllegalStateException(“String ‘message’ cannot be null or empty.” );

  this.code = code;
  this.message = message;

}

public Message (String message) {
this(200, message); // 200 é o código padrão quando o request deu certo.
}

// Getters
}[/code]
Daí, na sua action, você primeiro verifica se o id que você está recebendo é maior que zero e diferente de null (pode colocar em um estático também)
Se não for maior que zero ou diferente de null, você retorna um JSON dando um new Message(500, this.bundle.getString("erro_id_invalido" ))
Se for, você consegue fazer o get do Hibernate.
O objeto que o Hibernate retorna tem que estar populado, se vier null é pq não encontrou no banco de dados e ai vc consegue retornar outro JSON com um new Message(500, this.bundle.getString("erro_produto_nao_encontrado"))

Ve se isso te ajuda.

Valeu de novo, velho. Vou tentar aqui :slight_smile: