Criar galeria de imagens com VRaptor 3 [Resolvido]

E ai Garcia!
Devido ao tempo ser curto, resolvi descartar a galeria, vou fazer galeria de “uma” imagem apenas. =)
Tenho uma lista de imóveis e ao clicar em “visualizar” redireciona para uma JSP view() que é a responsável por mostrar a imagem daquele imóvel:

<display:column title="Imagem"><a href="view?idImovel=${imovel.idImovel}">view</a></display:column>  

Ai na JSP tô tentando chamar a imagem desse imóvel, mas usando displaytag ele mostra todas as imagens da pasta, eu preciso que mostre apenas a do imóvel em questão, tentei assim e não deu:

<img src="<c:url value="/imovel/${imovel.idImovel }/imagem"/>" width="500" height="500"/>

Usando displaytag, me mostra todas as imagens:

<display:table name="${imovel}" id="imovel" requestURI="/imobiliaria/imovel/lista">
<display:column title="Imagem"><img src="<c:url value="/imovel/${imovel.idImovel }/imagem"/>" width="500" height="500"/></display:column>
</display:table> 

Têm idéia de como mostrar apenas a imagem do imóvel selecionado?
Abraço!!

Guevara, não consigo entender como dá null-pointer naquela linha. Conforme seus prints os objetos não estão nulos, não deveria dar esse erro. Eu ainda acho que você precisa fazer um debug mais completo para ver onde ter nulos. Com aquele código que eu te mandei não tem como dar erro. Você tentou ele?

Um erro que notei é sua classe ImagemDAO ciomo atributo de classe. Você está injetando ela no construtor?

Dentro da classe Imovel você pode colocar o atributo foto como String.

public class Imovel { private String foto; }

E nele colocar o caminho da imagem

E ai Garcia!
Consegui mostrar a imagem desta forma.
Tenho um link na página de listagem de imóvel, este link é para ver a imagem do imóvel:

<display:column title="Imagem"><a href="view?idImovel=${imovel.idImovel}">view</a></display:column>  

Vai direcionar para uma view.jsp, que possui este código para mostrar a foto:

<img src="<c:url value="/imovel/${imovel.idImovel}/imagem"/>" width="500" height="500"/>

Ao clicar em “view” la na listagem dava problema, pq chegando na view.jsp a id do imóvel não ia junto, a linha acima estava com id null, então para que a view fosse carregada com a id do imóvel coloquei na IndexController:

@Path("/view")
	public void view(Long idImovel) {
		result.include("imovel", imovelDao.carrega(idImovel));
	}

Mandei o método “carrega” para a view carregar o imóvel e assim carregar a imagem. não sei se seria a forma mais correta para resolver o problema, do jeito que está, o imóvel é carregado uma vez na listagem (normal) e outra vez na view.jsp (não sei se é correto fazer isso), mas a imagem está sendo carregada para aquele imóvel em questão.
Em relação ao ImovelDAO eu tentei dentro e fora do construtor, deu na mesma, img continua null, vou tentar de novo e posto aqui.
Mostrei o projeto para que ele receba o trato de web design, enquanto isso tô batendo a cabeça aqui com a galeria. =)
Vou ver se essa sua última dica postada pode substituir o que eu já tenho aqui.
Quanto ao debug, eu não conheço o Eclipse a fundo para fazer isso direito, preciso pesquisar para aprender a fazer esse debug.
Abraço!!!

Fala ai galera!
Continuando a minha saga em criar a galeria de imagens, me apareceu mais um erro que não consegui compreender.
As imagens estão sendo salvas na pasta com id do imóvel, nome da foto e nome da imagem upada, mas ao upar me aparece este erro:

java.lang.NullPointerException
	br.com.imobiliaria.component.Imagens.salva(Imagens.java:49)
	br.com.imobiliaria.controller.FotoController.upload(FotoController.java:52)
	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)

A linha FotoController.upload(FotoController.java:52) se refere a este código:

imagens.salva(imagem,imovel,foto);

O método salva é este:

public void salva(UploadedFile imagem, Imovel imovel, Foto foto ) {
		//String uuid = UUID.randomUUID().toString();
		File destino = new File(pastaImagens, imovel.getIdImovel() +  "." + foto.getNome() + "." + imagem.getFileName());		
				
		try {
			IOUtils.copyLarge(imagem.getFile(), new FileOutputStream(destino));	
			foto.setImovel(imovel);
			String nome = foto.getNome();
			foto.setNome(nome);
			String caminho = destino.getAbsolutePath();
			foto.setUrlFoto(caminho);
		    fotoDAO.adiciona(foto,imovel);
		} catch (IOException e) {
			throw new RuntimeException("Erro ao copiar imagem", e);
		}
		
	}

A linha Imagens.salva(Imagens.java:49) se refere a este código:

   fotoDAO.adiciona(foto,imovel);

O método adiciona é este:

public void adiciona(Foto foto, Imovel imovel) {
		Transaction tx = session.beginTransaction();
		session.save(imovel);
		session.save(foto);
		tx.commit();
	}

Não entendo como pode estar salvando os dados na imagem upada na pasta e não salvar estes mesmos dados no banco. =/
Outra coisa que achei muito estranho é que só consigo upar a imagem se colocar a id do imóvel na action do form:

/imovel/${imovel.idImovel}/imagem

O form abaixo não envia a id do imóvel pro Controller num input hidden, deveria enviar já que o nome chega no Controller:

<form action="<c:url value="/foto/upload"/>" method="POST" enctype="multipart/form-data">
    <fieldset>
        <legend>Upload de Imagem</legend>
        <input type="hidden" value="${imovel.idImovel}">
        <input type="text" name="foto.nome" />
        <input type="file" name="imagem" /> 
        
        <button type="submit">Enviar</button>
    </fieldset>
</form>

Coloquei então um breakpoint em fotoDAO.adiciona(foto,imovel) para ver o que aparecia no debug, o resultado foi este:

Alguém sabe o motivo desses problemas?
Abraço!!

Resolvido! \o/

Explicando de forma resumida o que eu fiz (com a ajuda do Lucas Cavalcanti e do Garcia). Tenho uma classe Imóvel e uma classe Foto numa relação @OneToMany, um imóvel pode ter várias fotos e uma foto só pode pertencer a um imóvel.
Após criar as classes e fazer as anotações JPA, as tabelas são criadas pelo Hibernate e já é possível começar a desenvolver o código para a criação da galeria de imagens com VRaptor 3.
Eu criei uma classe FotoDAO, para não sobrecarregar a classe ImovelDAO com requisições de fotos, e nela coloquei os métodos para obter as fotos:

@SuppressWarnings("unchecked")
	public List<Foto> getGaleria(Long idImovel) {			
	    return session.createQuery("from Foto f where f.imovel.id = :id")
		   .setParameter("id", idImovel).list();
	}
public Foto carrega(Long idFoto) {
		return (Foto)  this.session.load(Foto.class, idFoto);		
	}

Quem vai usar estes métodos é o controlador FotoController (criei um controlador só para as fotos), que vai enviar as fotos para a JSP desta maneira:

@Path("/imagem/{idFoto}")
	public InputStream mostraFoto(Long idFoto) throws FileNotFoundException {
	     Foto foto = fotoDAO.carrega(idFoto); // carrega objeto foto
	     return new FileInputStream(new File("/home/bruno/fotos", foto.getUrlFoto()));
	}
	
	 public void adiciona(Long idImovel) {
		 result.include("imovel", imovelDAO.carrega(idImovel)); // carrega objeto imóvel	
		 result.include("fotos", fotoDAO.getGaleria(idImovel)); // envia a url e o nome das fotos		 
	 }

E finalmente na página JSP as fotos, a url e o nome delas são capturadas assim:

<div id="gallery">
<c:forEach var="foto" items="${fotos}">
    <ul>
        <li>        	
            <a href="<c:url value="/imagem/${foto.idFoto}"/>" rel="lightbox" title="${foto.nome }" >
                                  
            <img src="<c:url value="/imagem/${foto.idFoto }"/>" width="350" height="250" />                      	                        	 
            
            </a>         
        </li>
   </ul>
</c:forEach>
</div>

Repare no @Path que coincide com o mesmo que está no controlador FotoControler.
Voltei para postar a solução, pois galeria de fotos em Java não é uma coisa fácil de achar no Google, muito menos usando VRaptor 3. Espero que seja de grande utilidade para todos.
Agradeço mais uma vez a ajuda do Lucas, do garcia e do Lavieri que sempre estão no fórum ajudando o pessoal com uma paciência de monge Budista.
Vou aproveitar e postar no meu blog a solução, para eternizar isto.
Abraço!

Pessoal, eu sei que o topico já está um pouco antigo, mas eu gostaria de agradecer a todos pelas informações.
Estava tomando uma surra pra consguir montar uma galeria de imagens upadas pelos clientes e este topico me ajudou a conseguir!
Vlw Guevara!!!
:smiley:

Pessoa boa tarde.
Desculpa ressuscitar este tópico, mas estou com uma dúvida aqui que estou tentando resolver a dias mas não encontro uma solução.
Primeiro vou explicar o que estou fazendo: Estou desenvolvendo uma aplicação para o meu tcc, de aluguel de imóveis, assim como o Guevara (creio eu). Estou pegando o caminho das imagens e as salvando no banco de dados com o id do imóvel e a “imagem” na pasta do servidor, a parte de salvar esta dando certo. Lembrando que cada imóvel possui muitas imagens e uma imagem apenas a um imóvel.

E tentando exibi-las em minha jsp, onde não obtive sucesso até agora.

//acesso a lista de imagens dentro da classe imóveis - private List<Imagens> imagens; <c:forEach items="${imovel.imagens}" var="imagem"> <img src="<c:url value="/imagens/${imagem.imovel.id}"/>" width="30" height="30"/> </c:forEach>

Esta URI se diz respeito ao meu método da controller para exibição.

@Get("/imagens/{imovel.id}") public List<File> download(Imovel imovel){ return img.mostrar(imovel); }

Agora é onde eu estou me embananando!! Eu sei que este método está errado, é ai que peço a ajuda de vocês …

[code]public List mostrar(Imovel imovel) {

    List<Imagens> imagens = dao.listar(imovel);
    for (Imagens img : imagens) {
        String caminho = img.getCaminho();
        this.imagem.setCaminho(caminho);
    }
    return (List<File>) new File(pastaImagens, this.imagem.getCaminho()+".image");
}[/code] 

A baixo o método que recupero as imagens salvas no banco, ImagensDAO

[code]public List listar(Imovel imovel) {

    return sessao.createCriteria(Imagens.class)
    .add(Restrictions.eq("imovel", imovel)).list();
}[/code]

Resumindo, recupero o caminho das imagens salvas no banco de dados e faço a busca delas na pasta do servidor através deste caminho. Mas o problema está que não estou sabendo pegar estes caminhos e encontrar as devidas imagens no servidor.

Desde já agradeço a ajuda!

Galera deu certo, consegui resolver este problema ! Do jeito que estava fazendo nunca ia dar certo ! haha
Obrigado