Opa! Olha eu aqui de novo pra bater o ponto!
Essa aqui eu não entendi, um método usando Criteria só está funcionando em um Controller, no outro não.
O método com Criteria é este:
public Foto getAvatar(Long codImovel) {
Criteria crit = session.createCriteria(Foto.class);
crit.add(Restrictions.eq("avatar", true)); // avatar é atributo boolean na classe Foto
crit.createAlias("imovel", "codImovel");
crit.add(Restrictions.eq("imovel.codImovel", codImovel));
return (Foto) crit.uniqueResult();
}
No ImovelController ele funciona:
public void visualizar(Long codImovel) {
result.include("imovel", imovelDao.carrega(codImovel));
result.include("foto", fotoDAO.getAvatar(codImovel)); // aqui retorna na boa o objeto Foto
}
O Imovel é carregado e o avatar também.
Agora, no FotoController não funciona (fotoDAO está injetado no construtor):
public void atualizaAvatar(Long codImovel, Long idFoto) {
Foto foto = fotoDAO.getAvatar(codImovel); // aqui é o problema
foto.setAvatar(false); // foto está null, o getAvatar não carrega a Foto
Foto atual = fotoDAO.carrega(idFoto);
atual.setAvatar(true);
fotoDAO.atualiza(atual, foto);
result.include("mensagem", "Avatar selecionado com sucesso!");
result.use(Results.logic()).redirectTo(FotoController.class).adiciona(codImovel);
}
O getAvatar() ali não retorna nada.
Stacktrace:
Caused by: java.lang.NullPointerException
at br.com.imobiliaria.controller.FotoController.atualizaAvatar(FotoController.java:119)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:57)
... 50 more
Mais um detalhe, ao salvar uma foto, a tabela Foto fica com a coluna avatar “FALSE”, então pra testar isso na jsp bastaria colocar:
<c:if test="${foto.avatar eq false}">
<p>O imóvel não possui avatar, faça upload de uma foto ou selecione-a na galeria.</p>
</c:if>
Mas não funciona, têm que ser com “null”
<c:if test="${foto.avatar eq null}">
<p>O imóvel não possui avatar, faça upload de uma foto ou selecione-a na galeria.</p>
</c:if>
Aí o teste funciona. O.o
Tô quebrando a cabeça aqui com essas zicas mas não consegui descobrir onde está o problema.
Abraço!!!