Java.lang.IllegalArgumentException: id to load is required for loading [Resolvido]

21 respostas
Guevara

Oi pessoal!!
Tô com um probleminha aqui ao dar um refresh com F5 na página de adicionar fotos, depois que adiciono a foto e dou F5 redireciona para http://localhost:8080/imobiliaria/foto/adiciona e me dá este erro de id:

root cause

java.lang.IllegalArgumentException: id to load is required for loading
	org.hibernate.event.LoadEvent.<init>(LoadEvent.java:89)
	org.hibernate.event.LoadEvent.<init>(LoadEvent.java:61)
	org.hibernate.impl.SessionImpl.load(SessionImpl.java:974)
	org.hibernate.impl.SessionImpl.load(SessionImpl.java:970)
	br.com.imobiliaria.dao.ImovelDAO.carrega(ImovelDAO.java:69)
	br.com.imobiliaria.controller.FotoController.adiciona(FotoController.java:76)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)

O lance é que o método adiciona() possui o método carrega() e getGaleria() passando os objetos:

public void adiciona(Long idImovel) {
		 result.include("imovel", imovelDAO.carrega(idImovel));//carrego objeto Imovel	
		 result.include("fotos", fotoDAO.getGaleria(idImovel)); // carrego objeto Foto	
		 result.include("qtd", fotoDAO.getQtdFotos(idImovel)); // carrego quantidade de fotos
	}

Pelo erro que ele aponta dá a entender que o problema seria com o meu método carrega imóvel, aqui está ele:

public Imovel carrega(Long idImovel) {
		    return (Imovel) this.session.load(Imovel.class, idImovel);
	 }

Que id é esse que ele quer se ao chamar o método adiciona() carrego os dois objetos? O.o
Abraço!!!

21 Respostas

Guevara

Rodei em modo debug colocando o breakpoint no método carrega, na primeira vez que dei F5 o id do imóvel carregou e a página tb, na segunda veio null, ou seja, o método não está carregando o imóvel corretamente ou existe algum problema em relação ao refresh.

Lucas_Cavalcanti

vc tah dando um redirect depois de submeter o formulário?

Guevara

Oi lucas!
Tô redirecionando sim, tanto que após a inclusão redireciona para a página de adição de fotos:

@Post
	@Path("/foto/{imovel.idImovel}/")
	public void upload(final UploadedFile imagem, final Imovel imovel, final Foto foto) {
		//final Long qtd = fotoDAO.getTotalFotos(imovel);
		validator.checking(new Validations() {
			{
				if (that(imagem, is(notNullValue()), "imagem", "imagem.nula")) {
				    that(imagem.getContentType(), startsWith("image"), "imagem", "nao.eh.imagem");				  
				}
					that(!foto.getNome().isEmpty(), "img.nome",
					"imgNome.obrigatorio");
			}				
		});
		
		validator.onErrorUse(Results.logic()).redirectTo(FotoController.class).adiciona(imovel.getIdImovel());
		imagens.salva(imagem,imovel,foto);
		// Retornando mensagem de sucesso na inclusão
		result.include("mensagem", "Imagem adicionada com sucesso");
		result.use(Results.logic()).redirectTo(FotoController.class).adiciona(imovel.getIdImovel());

	 }

Parece que ao dar F5 ele perde a id do imóvel quando o método adiciona() é invocado diretamente. É como se eu chamasse o método adiciona no browser, ele perde a id e lança esse erro. =/

Lucas_Cavalcanti

sim, pq vc tah passando via parâmetro do request (query parameter)

coloque um @Path que contenha o id do imovel em algum lugar que vc não vai ter mais esse problema

Guevara

Desculpe Lucas, não entendi, colocar um @Path em que método? No adiciona()?

Lucas_Cavalcanti

isso

Guevara

Tentei assim:

@Path("foto/adiciona")
	 public Imovel adiciona(Long idImovel) {		 
		 result.include("fotos", fotoDAO.getGaleria(idImovel));	
		 result.include("qtd", fotoDAO.getQtdFotos(idImovel));
		 return imovelDAO.carrega(idImovel);
	}

É isso? Continua perdendo a id.

Lucas_Cavalcanti

coloca:

@Post @Path("/foto/{idImovel}")
public Imovel adiciona(Long idImovel) {

( isso que eu quis dizer com colocar o id no @Path )

Guevara

Preciso alterar tb a forma de chamar o adiciona()? Coloquei o Path e agora acusa erro 404.
Está assim:

<a href="/imobiliaria/foto/adiciona?idImovel=${imovel.idImovel}">entrar</a>
Lucas_Cavalcanti

isso… precisa alterar pra:

<a href="/imobiliaria/foto/${imovel.idImovel}">entrar</a>

e trocar o @Post do método adiciona por @Get, ou simplesmente removê-lo (achei que já era o submit da imagem, sorry)

Guevara

Funcionou Lucas. =)
Têm como redirecionar para esse Path após efetuar o upload? Do jeito que está ele chama o método:

result.use(Results.logic()).redirectTo(FotoController.class).adiciona(imovel.getIdImovel());
Lucas_Cavalcanti

como assim chama o método?

isso redireciona para a uri do método adiciona do FotoController, passando o parametro…
ou seja, vai mandar um redirect pra /foto/

Guevara

É, o redirecionamento está certo, o que tá pegando é que deu zica ao efetuar o upload, a id do imóvel até aparece na página adiciona() mas ao efetuar o upload a id não é enviada.
Antes do upload:

http://localhost:8080/imobiliaria/foto/59

Após o upload dá o erro 404 e a url fica assim no browser:

http://localhost:8080/imobiliaria/foto//

Acho que a action do form de upload não está pegando a id do imóvel se passar a id assim:

<a href="/imobiliaria/foto/${imovel.idImovel}">entrar</a>

Assim está a action:

<form action="<c:url value="/foto/${imovel.idImovel}/"/>" method="POST" enctype="multipart/form-data">

É isso mesmo, ao passar a id daquela forma nada é carregado do imóvel. Tô tentando ainda.

Lucas_Cavalcanti

existe o método imovel.setIdImovel???

debuga dentro do método upload, e vê se o id do imovel vem populado qdo vc envia o upload

Guevara

Método imovel.setidImovel não tenho não. Onde ficaria? =/
Rodei em debug e o método carrega, está mandando os dados pra jsp, mas ela não está recebendo, por isso não faz o upload.

Lucas_Cavalcanti

dentro da classe Imovel, tem o método setIdImovel?

se não tem, crie-o (lembre-se que ele eh um setter)

Guevara

Eu já tinha quando criei os getters e setters da classe Imóvel:

public void setIdImovel(Long idImovel) {
		this.idImovel = idImovel;
	}

Pensei que fosse outro setter. =)

Lucas_Cavalcanti

então não faz sentido…

se vc chamou a url /…/foto/12/, ele deveria cair na lógica upload, com o imovel.getImagemId() preenchido… e aparentemente isso não tá acontecendo…

tenta debugar isso direitinho e confirmar isso

Guevara

Deu certo, agora ao dar o F5 ele não perde a id, as chamadas aos métodos ficou diferente:
Chamando o método adiciona().

<a href="/imobiliaria/foto/adiciona/${imovel.idImovel}">entrar</a>

Anotação no método adiciona():

@Path("/foto/adiciona/{idImovel}")

Depois das alterações deu zica para excluir, então segui a mesma lógica:
Anotação no método remove():

@Path("/foto/remove/{idFoto}")

Na JSP ficou assim o método remover:

<a href="/imobiliaria/foto/remove/${foto.idFoto}">remover</a>

Ficou feio assim ou tá dentro das boas práticas?
Valeu Lucas! =)

Lucas_Cavalcanti

tá ok…

dá pra melhorar algumas coisas, mas tah tudo certo… boa sorte aí!

seufagner

idImovel está nulo. verifique se o nome está correto no formulário

Criado 27 de maio de 2010
Ultima resposta 28 de mai. de 2010
Respostas 21
Participantes 3