Criar galeria de imagens com VRaptor 3 [Resolvido]

47 respostas
Guevara

Oi pessoal!!
A saga continua, tô tentando fazer uma galeria de imagens mas tá complicado.

Tenho uma classe Imagens com atributo urlImagem:

@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	@Column(name="url_imagem")
	private String urlImagem;
	@ManyToOne
	@JoinColumn(name="id_imovel")
	private Imovel imovel;

Na classe Imovel está:

@OneToMany(mappedBy="Imovel")
	public List<Imagem> getImagem() {
		return getImagem() ;
	}

Na classe componente Imagens está:

public void salva(UploadedFile imagem, Imovel imovel) {	
		String uuid = UUID.randomUUID().toString();
		File destino = new File(pastaImagens, imovel.getIdImovel() + ".imagem"+uuid);
		try {
			IOUtils.copyLarge(imagem.getFile(), new FileOutputStream(destino));
			//String urlImagem = imagem.getFileName();
			//String urlImagem = destino.getAbsoluteFile();
			//img.setUrlImagem(urlImagem);
			//imagemDAO.adiciona(urlImagem);
		} catch (IOException e) {
			throw new RuntimeException("Erro ao copiar imagem", e);
		}
	}

Como podem ver, preciso pegar o “destino” e persistir em Imagem, mas não sei como fazer isso. Pelo menos já consigo salvar imagens como nomes diferentes usando a classe uuid, criei um método pra ver se a imagem já existe(não sei se vai funcionar):

public boolean existeImagem(Imagem imagem) {
		Imagem encontrada = (Imagem) session.createCriteria(Imagem.class)
	    .add(Restrictions.eq("urlImagem", imagem.getUrlImagem()))
	    .uniqueResult();
		return encontrada != null;
	}

Têm como salvar e obter as imagens do banco sem precisar daquele @Path(/imovel/{imovel.idImovel}/imagem)? Queria apenas usar o banco pra isso.
Tô precisando da ajuda de vcs pra resolver essa salada. =/
Abraço!!

47 Respostas

G

Você quer gravar a imagem no banco de dados, ou quer salvar o caminho da imagem no banco e acessá-la pelo filesystem?

Guevara

Oi Garcia!!!
Quero salvar o caminho no banco, ai depois quero chamar esse caminho para popular uma tabela por exemplo. Criar uma galeria mesmo com varias fotos referentes àquele imóvel.

G

Porque você usou na entidade imóvel uma lista de imagens, porém com o atributo no singular? O relacionamento de imóvel > imagem é one-to-many ou one-to-one? Além disso sua entidade Imagem possui apenas o caminho da imagem ou tem mais algum atributo?

Guevara

Coloquei getImagem pq a classe é Imagem, só pra eu não me perder.
A idéia é um imóvel ter várias imagens, mas uma imagem pertencer a apenas um imóvel. não está certo?? =/

G
A idéia é um imóvel ter várias imagens, mas uma imagem pertencer a apenas um imóvel. não está certo?? =/

Se você tem uma lista de imagens deveria ser getImagens() e não getImagem().

Se você tem apenas o caminho da imagem você nem mesmo precisa da entidade imagem, pois no hibernate e no JPA2 você pode ter uma lista de strings.

Sua classe Imóvel
public class Imovel {
    [...]
    
    @OneToMany
    public List<Imagem> imagens;

    public List<Imagem> getImagens() {
        return imagens;
    }

    public void setImagens(List<Imagem> imagens) {
        this.imagens = imagens;
    }
}
No seu controller
public void salva(UploadedFile imagem, Imovel imovel) {
        String uuid = UUID.randomUUID().toString();
        File destino = new File(pastaImagens, imovel.getIdImovel() + ".imagem" + uuid);
        
        try {
            IOUtils.copyLarge(imagem.getFile(), new FileOutputStream(destino));
            
            Imagem imagem = new Imagem();
            imagem.setUrl(destino.getName());
            
            // salva aqui a imagem no banco
        } catch (IOException e) {
            throw new RuntimeException("Erro ao copiar imagem", e);
        }
    }
}

Sua entidade imagem me parece correta para o propósito que você quer. Perguntei se ela contém apenas o caminho da imagem porque se ela tiver apenas essa propriedade você pode usar o @ElementCollection.

Guevara

Olha ai Garcia, tá dando erro para criar o relacionamento:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'br.com.caelum.vraptor.util.jpa.EntityManagerCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'entityManagerCreator': Unsatisfied dependency expressed through constructor argument with index 0 of type [javax.persistence.EntityManagerFactory]: : Error creating bean with name 'br.com.caelum.vraptor.util.jpa.EntityManagerFactoryCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactoryCreator': Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: javax.persistence.OneToOne.orphanRemoval()Z; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'br.com.caelum.vraptor.util.jpa.EntityManagerFactoryCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactoryCreator': Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: javax.persistence.OneToOne.orphanRemoval()Z

Tô fazendo assim, classe Imovel:

@OneToMany(mappedBy="imovel")
	public List<Imagem> imagens;

	public List<Imagem> getImagens() {
	      return imagens;
	}

	public void setImagens(List<Imagem> imagens) {
	      this.imagens = imagens;
	}

Classe Imagem:

@ManyToOne
	@JoinColumn(name="id_imovel")
	private Imovel imovel;
	
	
	public Imovel getImovel() {
		return imovel;
	}
	public void setImovel(Imovel imovel) {
		this.imovel = imovel;
	}

Tentei de outras formas seguindo exemplo de uma revista de Java que tenho aqui e não tá dando certo. =/

G
Que coisa estranha. Você está usando qual appserver e qual versão do Hibernate?

Abraços

Que coisa estranha. Você está usando qual appserver e qual versão do Hibernate?

Abraços

Guevara

Tô usando o Hibernate 3.5 final e Tomcat 6.0.26, a última versão.
Nem seguindo esta dica resolveu:
http://code.google.com/p/exemplos/wiki/jpaCinco
Tá osso! =/

Guevara

Achei isto aqui: http://javablog.co.uk/2009/12/27/onetomany-fixes-in-jpa-2/

Parece que mudaram a forma de criar esse tipo de coleções, e para usar as novidades teria que alterar o persistent.xml.
O parâmetro orphanRemoval = true não deu certo tb.

Guevara

É, parece que para mapear agora é:

@ElementCollection
	public List<Imagem> imagens;
	
	public List<Imagem> getImagens() {
	      return imagens;
	}

	public void setImagens(List<Imagem> imagens) {
	      this.imagens = imagens;
	}

E na classe Imagem:

@ManyToOne
	@JoinColumn(nullable = false)
	private Imovel imovel;
	
	public Imovel getImovel() {
		return imovel;
	}
	public void setImovel(Imovel imovel) {
		this.imovel = imovel;
	}

A saida do erro mudou:

exception

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'indexController' defined in file [/home/bruno/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp2/wtpwebapps/Imobiliaria/WEB-INF/classes/br/com/imobiliaria/controller/IndexController.class]: Unsatisfied dependency expressed through constructor argument with index 1 of type [br.com.imobiliaria.dao.ImovelDAO]: : Error creating bean with name 'imovelDAO' defined in file [/home/bruno/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp2/wtpwebapps/Imobiliaria/WEB-INF/classes/br/com/imobiliaria/dao/ImovelDAO.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [br.com.imobiliaria.dao.ImovelDAO]: Constructor threw exception; nested exception is java.lang.ExceptionInInitializerError; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'imovelDAO' defined in file [/home/bruno/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp2/wtpwebapps/Imobiliaria/WEB-INF/classes/br/com/imobiliaria/dao/ImovelDAO.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [br.com.imobiliaria.dao.ImovelDAO]: Constructor threw exception; nested exception is java.lang.ExceptionInInitializerError
	org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:698)
	org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:192)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:984)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:886)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:479)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
	org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:328)
	org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:43)
	org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:385)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:375)
	org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:1069)
	org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:221)
	br.com.caelum.vraptor.ioc.spring.VRaptorApplicationContext.getBean(VRaptorApplicationContext.java:244)
	br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.instanceFor(SpringBasedContainer.java:59)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:41)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.imobiliaria.interceptor.NoCacheInterceptor.intercept(NoCacheInterceptor.java:41)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.util.jpa.JPATransactionInterceptor.intercept(JPATransactionInterceptor.java:46)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

root cause

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'imovelDAO' defined in file [/home/bruno/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp2/wtpwebapps/Imobiliaria/WEB-INF/classes/br/com/imobiliaria/dao/ImovelDAO.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [br.com.imobiliaria.dao.ImovelDAO]: Constructor threw exception; nested exception is java.lang.ExceptionInInitializerError
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:946)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:890)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:479)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
	org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:328)
	org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:43)
	org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:820)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:762)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:680)
	org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:771)
	org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:691)
	org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:192)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:984)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:886)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:479)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
	org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:328)
	org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:43)
	org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:385)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:375)
	org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:1069)
	org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:221)
	br.com.caelum.vraptor.ioc.spring.VRaptorApplicationContext.getBean(VRaptorApplicationContext.java:244)
	br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.instanceFor(SpringBasedContainer.java:59)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:41)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.imobiliaria.interceptor.NoCacheInterceptor.intercept(NoCacheInterceptor.java:41)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.util.jpa.JPATransactionInterceptor.intercept(JPATransactionInterceptor.java:46)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

root cause

org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [br.com.imobiliaria.dao.ImovelDAO]: Constructor threw exception; nested exception is java.lang.ExceptionInInitializerError
	org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:141)
	org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:72)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:938)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:890)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:479)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
	org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:328)
	org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:43)
	org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:820)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:762)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:680)
	org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:771)
	org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:691)
	org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:192)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:984)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:886)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:479)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
	org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:328)
	org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:43)
	org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:385)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:375)
	org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:1069)
	org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:221)
	br.com.caelum.vraptor.ioc.spring.VRaptorApplicationContext.getBean(VRaptorApplicationContext.java:244)
	br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.instanceFor(SpringBasedContainer.java:59)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:41)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.imobiliaria.interceptor.NoCacheInterceptor.intercept(NoCacheInterceptor.java:41)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.util.jpa.JPATransactionInterceptor.intercept(JPATransactionInterceptor.java:46)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

root cause

java.lang.ExceptionInInitializerError
	br.com.imobiliaria.dao.ImovelDAO.<init>(ImovelDAO.java:20)
	sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:126)
	org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:72)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:938)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:890)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:479)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
	org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:328)
	org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:43)
	org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:820)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:762)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:680)
	org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:771)
	org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:691)
	org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:192)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:984)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:886)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:479)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
	org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:328)
	org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:43)
	org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:385)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:375)
	org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:1069)
	org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:221)
	br.com.caelum.vraptor.ioc.spring.VRaptorApplicationContext.getBean(VRaptorApplicationContext.java:244)
	br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.instanceFor(SpringBasedContainer.java:59)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:41)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.imobiliaria.interceptor.NoCacheInterceptor.intercept(NoCacheInterceptor.java:41)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.util.jpa.JPATransactionInterceptor.intercept(JPATransactionInterceptor.java:46)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

root cause

org.hibernate.MappingException: Could not determine type for: br.com.imobiliaria.bean.Imagem, at table: Imovel_imagens, for columns: [org.hibernate.mapping.Column(imagens)]
	org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:290)
	org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:274)
	org.hibernate.mapping.Collection.validate(Collection.java:301)
	org.hibernate.cfg.Configuration.validate(Configuration.java:1197)
	org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1378)
	org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
	br.com.imobiliaria.dao.HibernateUtil.<clinit>(HibernateUtil.java:18)
	br.com.imobiliaria.dao.ImovelDAO.<init>(ImovelDAO.java:20)
	sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:126)
	org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:72)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:938)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:890)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:479)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
	org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:328)
	org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:43)
	org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:820)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:762)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:680)
	org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:771)
	org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:691)
	org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:192)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:984)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:886)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:479)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
	org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:328)
	org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:43)
	org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:385)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:375)
	org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:1069)
	org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:221)
	br.com.caelum.vraptor.ioc.spring.VRaptorApplicationContext.getBean(VRaptorApplicationContext.java:244)
	br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.instanceFor(SpringBasedContainer.java:59)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:41)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.imobiliaria.interceptor.NoCacheInterceptor.intercept(NoCacheInterceptor.java:41)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.util.jpa.JPATransactionInterceptor.intercept(JPATransactionInterceptor.java:46)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

Acontece que na IndexContoller estou mandando uma lista para a pagina index.jsp:

result.include("imovel", imovelDao.lista());

E na ImovelDAO está listando assim:

@SuppressWarnings("unchecked")
	public List<Imovel> lista() {
		return session.createCriteria(Imovel.class).list();

Preciso alterar a forma de listar imóveis para que resolva esse erro?
Abraço!!!

Guevara

Dei uma pesquisa aqui e achei uns links sobre JPA 2:
http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html/configuration.html


http://www.edsongoncalves.com.br/2010/02/03/jpa-2-0-na-pratica-parte-2/

Fui alterando o persistence.xml até ficar assim:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"
			 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
			 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
			 http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="Account" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>  
        <properties>        	
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
            <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost/imobiliaria" />
            <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />
            <property name="javax.persistence.jdbc.password" value="senha" />
            <property name="javax.persistence.jdbc.user" value="postgres" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>           
        </properties>
</persistence-unit>
</persistence>

O erro que dá é que o persistence unit está como “default”, sendo que no meu está persistence-unit name=“Account”. Se colocar default dá o mesmo erro:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'JPATransactionInterceptor': Unsatisfied dependency expressed through constructor argument with index 0 of type [javax.persistence.EntityManager]: : Error creating bean with name 'br.com.caelum.vraptor.util.jpa.EntityManagerCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'entityManagerCreator': Unsatisfied dependency expressed through constructor argument with index 0 of type [javax.persistence.EntityManagerFactory]: : Error creating bean with name 'br.com.caelum.vraptor.util.jpa.EntityManagerFactoryCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactoryCreator': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: No Persistence provider for EntityManager named default; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'br.com.caelum.vraptor.util.jpa.EntityManagerFactoryCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactoryCreator': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: No Persistence provider for EntityManager named default; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'br.com.caelum.vraptor.util.jpa.EntityManagerCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'entityManagerCreator': Unsatisfied dependency expressed through constructor argument with index 0 of type [javax.persistence.EntityManagerFactory]: : Error creating bean with name 'br.com.caelum.vraptor.util.jpa.EntityManagerFactoryCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactoryCreator': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: No Persistence provider for EntityManager named default; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'br.com.caelum.vraptor.util.jpa.EntityManagerFactoryCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactoryCreator': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: No Persistence provider for EntityManager named default
	org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:698)
	org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:192)
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'entityManagerCreator': Unsatisfied dependency expressed through constructor argument with index 0 of type [javax.persistence.EntityManagerFactory]: : Error creating bean with name 'br.com.caelum.vraptor.util.jpa.EntityManagerFactoryCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactoryCreator': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: No Persistence provider for EntityManager named default; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'br.com.caelum.vraptor.util.jpa.EntityManagerFactoryCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactoryCreator': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: No Persistence provider for EntityManager named default
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactoryCreator': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: No Persistence provider for EntityManager named default

De onde ele está tirando esse default?
Abraço!!

G

Há alguma mensagem de erro? O que está acontecendo?:

Dê uma olhada se as suas libs estão corretas. Provavelmente você está usando Hibernate 3.5 com jars do JPA1 ao invés do JPA2.

@ElementCollection public List<Imagem> imagens;

Não use assim, está errado. @ElementCollection é quando você tem um List de Strings ou List e Enums. Não para quando você tem um List de entidade, que nesse caso deverá ser um @OneToMany

Para o vraptor trabalhar automagicamente com o entity-manager o nome dela deverá ser default. De uma olhada lá no final da página: http://vraptor.caelum.com.br/documentacao/componentes-utilitarios-opcionais/

Guevara

Salve !!!
O jar hibernate-jpa-2.0-api-1.0.0.Final.jar está na minha lib, no meu persistence.xml está como “default” e o erro continua sendo:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'entityManagerCreator': Unsatisfied dependency expressed through constructor argument with index 0 of type [javax.persistence.EntityManagerFactory]: : Error creating bean with name 'br.com.caelum.vraptor.util.jpa.EntityManagerFactoryCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactoryCreator': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: No Persistence provider for EntityManager named default; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'br.com.caelum.vraptor.util.jpa.EntityManagerFactoryCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactoryCreator': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: No Persistence provider for EntityManager named default

O provider que está no meu persistence.xml (org.eclipse.persistence.jpa.PersistenceProvider) é o correto para usar com persistent-unit default?
Abraço!!!

G

Sabe que e nunca trabalhei com JPA que não fosse em ambiente não gerenciado. A unica vez que usei JPA não gerenciado com Vraptor em um projeto de testes apanhei um monte, e se não me engano meu erro era de colocar o persistence.xml dentro do /src/META-INF.

Guevara

O meu está em /src/META-INF. O.o
Como vc conseguiu resolver??

Guevara

Preciso me benzer!
https://forum.hibernate.org/viewtopic.php?f=1&t=1003996
Só falta ser bug e eu não poder usar uma anotação @OneToMany.
Meu web.xml está padrão:

<context-param>  
    <param-name>br.com.caelum.vraptor.provider</param-name>  
    <param-value>br.com.caelum.vraptor.util.jpa.JPACustomProvider</param-value>  
    </context-param>

O persistence.xml deixei como estava antes:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence">
    <persistence-unit name="default">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>  
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
            <property name="hibernate.connection.url" value="jdbc:postgresql://localhost/imobiliaria" />
            <property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
            <property name="hibernate.connection.password" value="senha" />
            <property name="hibernate.connection.username" value="postgres" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>           
        </properties>
</persistence-unit>
</persistence>

E o erro é:

o: Error creating bean with name 'entityManagerFactoryCreator': Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z

Será que é algum bug com o ComponentFactories do VRaptor??? =/

G

Isso não sei te dizer porque não uso esses componentes do vraptor. O Lucas que pode nos dizer melhor se o Vraptor suporta JPA2, já que você usa Hibernate 3.5.

Aliás você está usando Hibernate 3.5.final? Você tem mais algum jar do JPA no classpath? Você está usando qual appserver?

G

Ei, você está usando o Eclipselink como implementação de JPA. Note essa linha no seu persistence.xml:

<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

para usar Hibernate é:

<provider>org.hibernate.ejb.HibernatePersistence</provider>

Vou te passar um exemplo do meu persistence.xml. Com pequenas alterações funciona para você. Como você não está em um ambiente gerenciado altere o transaction-type para RESOURCE_LOCAL, e remova o datasource. Adicione suas propriedades de conexão javax.persistence.jdbc* e remova minhas propriedades de cache. Após creio que tudo se resolve.

<?xml version="1.0" encoding="utf-8" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
   version="1.0">
	<persistence-unit name="default" transaction-type="JTA">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<jta-data-source>jdbc/cobDS</jta-data-source>
		

		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
			<property name="hibernate.bytecode.use_reflection_optimizer" value="true" />
			<property name="hibernate.use_sql_comments" value="true" />
			<property name="hibernate.hbm2ddl.auto" value="update" />
			
			<property name="hibernate.max_fetch_depth" value="5" />
			<property name="hibernate.default_batch_fetch_size" value="8" />
			  
			<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.SunONETransactionManagerLookup" />
			
                        <property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.infinispan.JndiInfinispanRegionFactory"/>
                        <property name="hibernate.cache.infinispan.cachemanager"  value="java:CacheManager"/>
			<property name="hibernate.cache.use_minimal_puts" value="true" />
			<property name="hibernate.cache.use_query_cache" value="true" />
			<property name="hibernate.cache.use_second_level_cache" value="true" />
			<property name="hibernate.cache.use_structured_entries" value="true" />
		</properties>
	</persistence-unit>
</persistence>
Guevara

Obrigado pela dica Garcia, eu já estava usando o Provider do Hibernate, reparei que esse precisaria registrar seguindo a dica do site do VRaptor, mas isso eu não saberia fazer, tô achando que é algo no VRaptor que precisa ser modificado pro entityManager funcionar.

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'br.com.caelum.vraptor.util.jpa.EntityManagerFactoryCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactoryCreator': Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z

O meu persistence.xml está assim:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"
			 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
			 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
			 http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="default" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>  
        <properties>        	
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
            <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost/imobiliaria" />
            <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />
            <property name="javax.persistence.jdbc.password" value="senha" />
            <property name="javax.persistence.jdbc.user" value="postgres" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>           
        </properties>
</persistence-unit>
</persistence>

A anotação está correta:

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "imovel")	
	public List<Imagem> imagens;

public List<Imagem> getImagens() {
	      return imagens;
	}

	public void setImagens(List<Imagem> imagens) {
	      this.imagens = imagens;
	}
@ManyToOne
	@JoinColumn
	private Imovel imovel;

Só falta remover o Hibernate 3.5 e voltar pro velho. =/

G

Guevara, faz uns testes usando JPA1 e Hibernate conforme os jars disponibilizados com o vraptor. Se der tudo certo é porque temos mesmo algum erro com o provider do Vraptor. Não sei se ele suporta JPA2, e se há alguma diferença nesse ponto entre JPA1 e JPA2.

Guevara

Beleza!!
Saca só: http://opensource.atlassian.com/projects/hibernate/browse/HHH-4740
O cara disponibilizou um projeto zipado que usa na anotação @OneToMany o parâmetro orphanRemoval = true, parece ser esse o problema, por algum motivo que eu não sei, ele não está disponivel com os jars que estão no vraptor e no hibernate 3.5.
Download: http://opensource.atlassian.com/projects/hibernate/secure/attachment/14976/WebJpa.zip
Olhei o persistence.xml dele e ele usa este property:

<property name="eclipselink.ddl-generation" value="create-tables"/>

Parece ser a única coisa de diferente.

Acrescentando mais um link interessante sobre o assunto do orphanRemoval=true —> http://www.jroller.com/eyallupu/entry/hibernate_3_5_jpa_2

G

Guevara, você então usou os jars disponibilizados pelo Hibernate 3.5 e funcionou agora? Não entendi muito bem se deu certo.

Eu aqui uso JPA 2 com Glassfish e implementado como Hibernate 3.5, e o atributo orphanRemoval NAO existe no @ManyToOne mas existe no @OneToMany e no @OneToOne.

Abraços

Guevara

Então, aqui não existe o orphanRemoval=true no meu @OneToMany. =/
Tô usando o jar do Hibernate 3.5 e os jars padrão do VRaptor, que jars vc têm ai, ou qual é o que te deu essa opção no @OneToMany?
Abraço!

G

Guevara:
Então, aqui não existe o orphanRemoval=true no meu @OneToMany. =/
Tô usando o jar do Hibernate 3.5 e os jars padrão do VRaptor, que jars vc têm ai, ou qual é o que te deu essa opção no @OneToMany?
Abraço!

Guevara, o meu caso não te ajuda porque eu uso Glassfish em ambiente gerenciado, ou seja, vem tudo do container, embora eu use Hibernate, recebo os jars do JPA2 do próprio container.

Se você preferir pode postar aqui suas libs e eu olho o que pode ser. Mas já te antecipo que você deve ver se nos teus jars não há versões diferentes do JPA e também se os jars são compatíveis entre sí (exemplo usar Hibernate 3.2 com JPA1 e Hibernate 3.5 com JPA2). Além disso procure se você não tem versões redundantes de jars do Hibernate, pois antigamente tinhamos o hibernate-core, hibernate-annotations e hibernate-entitymanager, e agora temos um hibernate-ALL-IN-ONE.

Vale lembrar que se você usa tomcat está tranquilo porque aquela coisa é pelada mesmo, mas se você usa JBOSS ou algum appserver do gênero talvez seu container já tenha os jars do JPA e esteja confundindo sua aplicação.

Guevara

Eu uso o Tomcat mesmo, aqui está a lista de jars que estão na minha lib:

antlr-2.7.6.jar
aopalliance.jar
aspectjrt.jar
c3p0-0.9.1.jar
cglib-nodep-2.1_3.jar
commons-beanutils-1.8.3.jar
commons-collections-3.1.jar
commons-fileupload-1.2.1.jar
commons-io-1.3.2.jar
commons-lang-2.5.jar
commons-logging.jar
displaytag-1.2.jar
displaytag-export-poi-1.2.jar
dom4j-1.6.1.jar
dom4j.jar
ehcache-1.5.0.jar
ejb3-persistence.jar
google-collect-1.0.jar
hamcrest-all-1.3RC0.jar
hamcrest-generator-1.3RC0.jar
hamcrest-integration-1.3RC0.jar
hamcrest-library-1.3RC0.jar
hibernate3.jar
hibernate-jpa-2.0-api-1.0.0.Final.jar
hibernate-jpamodelgen-1.0.0.Final.jar
javassist-3.9.0.GA.jar
joda-time-1.6.jar
joda-time-hibernate-1.2.jar
joda-time-jsptags-1.0.2.jar
jstl-api-1.2.jar
jstl-impl-1.2.jar
jta-1.1.jar
lista.txt
log4j-1.2.15.jar
mirror-1.5.1.jar
objenesis-1.1.jar
ognl-2.7.3.jar
org.springframework.aop-3.0.0.RELEASE.jar
org.springframework.asm-3.0.0.RELEASE.jar
org.springframework.aspects-3.0.0.RELEASE.jar
org.springframework.beans-3.0.0.RELEASE.jar
org.springframework.context-3.0.0.RELEASE.jar
org.springframework.core-3.0.0.RELEASE.jar
org.springframework.expression-3.0.0.RELEASE.jar
org.springframework.web-3.0.0.RELEASE.jar
paranamer-1.5.jar
postgresql-8.4-701.jdbc4.jar
restrictrex-1.0.2.jar
slf4j-api-1.5.8.jar
slf4j-log4j12-1.5.8.jar
vraptor-3.1.1.jar
xstream-1.3.1.jar

Abraço!!

Guevara

Tirei o Hibernate 3.5 e voltei pro anterior, mas mesmo assim o relacionamento com as anotações não estão acontecendo:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'JPATransactionInterceptor': Unsatisfied dependency expressed through constructor argument with index 0 of type [javax.persistence.EntityManager]: : Error creating bean with name 'br.com.caelum.vraptor.util.jpa.EntityManagerCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'entityManagerCreator': Unsatisfied dependency expressed through constructor argument with index 0 of type [javax.persistence.EntityManagerFactory]: : Error creating bean with name 'br.com.caelum.vraptor.util.jpa.EntityManagerFactoryCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactoryCreator': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build EntityManagerFactory; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'br.com.caelum.vraptor.util.jpa.EntityManagerFactoryCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactoryCreator': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build EntityManagerFactory; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'br.com.caelum.vraptor.util.jpa.EntityManagerCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'entityManagerCreator': Unsatisfied dependency expressed through constructor argument with index 0 of type [javax.persistence.EntityManagerFactory]: : Error creating bean with name 'br.com.caelum.vraptor.util.jpa.EntityManagerFactoryCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactoryCreator': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build EntityManagerFactory; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'br.com.caelum.vraptor.util.jpa.EntityManagerFactoryCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactoryCreator': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build EntityManagerFactory
	org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:698)
	org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:192)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:984)
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'br.com.caelum.vraptor.util.jpa.EntityManagerCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'entityManagerCreator': Unsatisfied dependency expressed through constructor argument with index 0 of type [javax.persistence.EntityManagerFactory]: : Error creating bean with name 'br.com.caelum.vraptor.util.jpa.EntityManagerFactoryCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactoryCreator': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build EntityManagerFactory; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'br.com.caelum.vraptor.util.jpa.EntityManagerFactoryCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactoryCreator': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build EntityManagerFactory
	org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:150)
	org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:109)
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'entityManagerCreator': Unsatisfied dependency expressed through constructor argument with index 0 of type [javax.persistence.EntityManagerFactory]: : Error creating bean with name 'br.com.caelum.vraptor.util.jpa.EntityManagerFactoryCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactoryCreator': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build EntityManagerFactory; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'br.com.caelum.vraptor.util.jpa.EntityManagerFactoryCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactoryCreator': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build EntityManagerFactory
	org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:698)
	org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:192)
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'br.com.caelum.vraptor.util.jpa.EntityManagerFactoryCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactoryCreator': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build EntityManagerFactory
	org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:150)
	org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:109)
javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build EntityManagerFactory
	org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:677)
	org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:126)
	javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:52)
	javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:34)
	br.com.caelum.vraptor.util.jpa.EntityManagerFactoryCreator.create(EntityManagerFactoryCreator.java:39)
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "imovel")
	public List<Imagem> imagens;
	
	public List<Imagem> getImagens() {
	      return imagens;
	}

	public void setImagens(List<Imagem> imagens) {
	      this.imagens = imagens;
	}
private Imovel imovel;
@ManyToOne
	@JoinColumn
	public Imovel getImovel() {
		return imovel;
	}

Tô no sal!!! =/

Guevara

O problema era a anotação orphanRemoval no @OneToMany, baixei o Hibernate 3.5.1 e ele me deu essa opção, coloquei as anotações nos atributos e deu certo, não pode anotar os gets que não vai.

Voltando a questão da galeria. =)

Garcia, fiz o que vc sugeriu, mas não está salvando o caminho no banco.

No componente deixei assim:
public void salva(UploadedFile imagem, Imovel imovel) {	
		String uuid = UUID.randomUUID().toString();
		File destino = new File(pastaImagens, imovel.getIdImovel() + ".imagem" + uuid);
		try {
			IOUtils.copyLarge(imagem.getFile(), new FileOutputStream(destino));
			Imagem img = new Imagem();
                        img.setUrlImagem(destino.getName());
			imagemDAO.adiciona(img);
		} catch (IOException e) {
			throw new RuntimeException("Erro ao copiar imagem", e);
		}
	}

No Controller está assim:

@Post 
	@Path("/imagem/{imovel.idImovel}/upload")
	public void upload(final Imovel imovel, final UploadedFile imagem) {		
		validator.checking(new Validations() {
			{
				if (that(imagem, is(notNullValue()), "imagem", "imagem.nula")) {
					that(imagem.getContentType(), startsWith("image"),
							"imagem", "nao.eh.imagem");
				}
			}
		});
			
			validator.onErrorUse(Results.page()).of(ImovelController.class).edita(imovel.getIdImovel());
			imagens.salva(imagem, imovel);
			  
			result.redirectTo(ImovelController.class).edita(imovel.getIdImovel());
		}

O erro é este:

root cause

java.lang.NullPointerException
	br.com.imobiliaria.component.Imagens.salva(Imagens.java:41)
	br.com.imobiliaria.controller.ImagemController.upload(ImagemController.java:47)
	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)

As imagens estão sendo salvas na pasta, mas no banco não aparece a url da imagem.
Ele não está executando a linha imagens.salva(imagem, imovel); e imagemDAO.adiciona(img);
Tentei tb fazer o upload sem a ID do imovel na action do form, desta forma:

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

O método upload é invocado mas não recebe a ID do imóvel que está no input hidden. =/
Alguma idéia do que pode estar acontecendo?
Abraço!!!

G

Está dando um nullpointer, o que tem nessa linha?

br.com.imobiliaria.component.Imagens.salva(Imagens.java:41)

Guevara

Oi Garcia!
É o método “adiciona” do DAO:

imagemDAO.adiciona(img);
G

Desculpe a demora. Temos que ver o que está retornando nulo para dar o null-pointer. Seu código não me parece ter erro, não entendo porque o nome vem nulo.

public void salva(UploadedFile imagem, Imovel imovel) { String uuid = UUID.randomUUID().toString(); File destino = new File(pastaImagens, imovel.getIdImovel() + ".imagem" + uuid); try { IOUtils.copyLarge(imagem.getFile(), new FileOutputStream(destino)); Imagem img = new Imagem(); img.setUrlImagem(destino.getName()); imagemDAO.adiciona(img); } catch (IOException e) { throw new RuntimeException("Erro ao copiar imagem", e); } }

Não sei o que tem na sua lina que dá um null-pointer, mas é a a DAO.adiciona, sua DAO não está vindo nula? A DAO está com @Component?

Guevara

Oi Garcia!!
A DAO está anotada como component, deixei desta forma, passando a classe Imagem no método:

@Post 
	@Path("/imagem/{imovel.idImovel}/upload")
	public void upload(final Imovel imovel, final UploadedFile imagem, Imagem img) {		
		validator.checking(new Validations() {
			{
				if (that(imagem, is(notNullValue()), "imagem", "imagem.nula")) {
					that(imagem.getContentType(), startsWith("image"),
							"imagem", "nao.eh.imagem");
				}
			}
		});
			
			validator.onErrorUse(Results.page()).of(ImovelController.class).edita(imovel.getIdImovel());
			imagens.salva(imagem, imovel, img);
			  
			result.redirectTo(ImovelController.class).edita(imovel.getIdImovel());
		}

E na classe componente Imagens está assim o método salva():

private ImagemDAO imagemDAO;
public void salva(UploadedFile imagem, Imovel imovel, Imagem img) {	
		String uuid = UUID.randomUUID().toString();
		File destino = new File(pastaImagens, imovel.getIdImovel() + ".imagem" + uuid);
		try {
			IOUtils.copyLarge(imagem.getFile(), new FileOutputStream(destino));
                        img.setUrlImagem(destino.getName());
			imagemDAO.adiciona(img);
		} catch (IOException e) {
			throw new RuntimeException("Erro ao copiar imagem", e);
		}
	}

O erro é este:

root cause

java.lang.NullPointerException
	br.com.imobiliaria.component.Imagens.salva(Imagens.java:39)
	br.com.imobiliaria.controller.ImagemController.upload(ImagemController.java:48)
	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)

Essa linha 39 é referente a esta linha:

img.setUrlImagem(destino.getName());

O que eu fiz foi passar a classe Imagem como parâmetro em Upload para que o método “salva” da classe Imagens pudesse encontrá-la. Não sei se isso está certo tb, mas a msg agora é referente ao “destino”.
Acho que o grande problema é que destino.getNome() é uma String e “img” é um objeto, ai tô salvando uma String como img e dá pau. Não é isso?
Abraço!! =)

G
Guevara, o erro é um null-pointer, ou seja, ou IMG ou DESTINO estão nulos. Você pode fazer um debug para ver qual eles está como nulo?

DESTINO não tem como ser nulo, pois criamos o File logo acima. Creio que IMG esteja nulo, e pelo que novo você não faz validação alguma com esse objeto. Lembre-se que o vraptor  instancia o objeto se tiver algum parametro associando a esse objeto, caso contrário ele vem null.

Guevara, o erro é um null-pointer, ou seja, ou IMG ou DESTINO estão nulos. Você pode fazer um debug para ver qual eles está como nulo?

DESTINO não tem como ser nulo, pois criamos o File logo acima. Creio que IMG esteja nulo, e pelo que novo você não faz validação alguma com esse objeto. Lembre-se que o vraptor só instancia o objeto se tiver algum parametro associando a esse objeto, caso contrário ele vem null.

Guevara

Oi Garcia!
Estou há dias olhando pra este código e não consigo ver problema nele.

private ImagemDAO imagemDAO;
private Imagem img;
public void salva(UploadedFile imagem, Imovel imovel) {			
		String uuid = UUID.randomUUID().toString();
		File destino = new File(pastaImagens, imovel.getIdImovel() + ".imagem" + uuid);		
		try {
			IOUtils.copyLarge(imagem.getFile(), new FileOutputStream(destino));
                        String urlImagem = destino.getName();
		        img.setUrlImagem(urlImagem);
		        imagemDAO.adiciona(img);			
		} catch (IOException e) {
			throw new RuntimeException("Erro ao copiar imagem", e);
		}
	}

Repare que ali é instanciada uma String uuid e é usada para gerar uma sequencia alfanumérica para o nome da imagem e em nenhum momento essa uuid veio por parâmetro lá da JSP ou Controller, e funciona. Pq a classe Imagem não funciona da mesma forma como a classe UUID? Se no VRaptor um objeto só é instanciado quando recebe parâmetros então a classe Imagem jamais será criada, já que nenhum atributo de Imagem poderá vir por parâmetro da JSP ou Controlle, pois o caminho não existe, passa a existir apenas e somente apenas em:

File destino = new File(pastaImagens, imovel.getIdImovel() + ".imagem" + uuid);

Não entendo tb como isto pode ser null:

String urlImagem = destino.getName();
img.setUrlImagem(urlImagem);

Infelizmente não conheço o VRaptor o suficiente para resolver isso.
Abraço!

G
Estou há dias olhando pra este código e não consigo ver problema nele.

Acho que você precisa é fazer um debug aí para entender os erros. Muitas coisas conseguimos detectar visualmente, mas nem sempre. Faça um debug, ou se você não sabe ou não quer fazer, use pelo menos uns sysout imprimindo todos os valores possívels para entender quem está null.

Uma coisa que notei agora... a tua variável img está como atributo de classe, porém ela NUNCA é inicializada. Percorrí visualmente seu código e vejo ela apenas ser declarada na linha 02 do código que você enviou, e logo depois você tenta chamar métodos dela.

Não conheço teu código nem mesmo sei o propósito dele, mas vou tentar algo aqui:

private ImagemDAO imagemDAO;

public void salva(UploadedFile imagem, Imovel imovel) {
	// cria a imagem
	String uuid = UUID.randomUUID().toString();
	File destino = new File(pastaImagens, imovel.getIdImovel() + ".imagem" + uuid);		

	try {
		// copia o conteúdo
		IOUtils.copyLarge(imagem.getFile(), new FileOutputStream(destino));
		
		// agora sim criando a entidade para salvar
		Imagem img = new Imagem();
	        img.setUrlImagem(destino.getName());

		// referencia para imóvel
		img.setImovel(imovel);
		
		// agora deve salvar sem null-pointer
	        imagemDAO.adiciona(img);

	} catch (IOException e) {
		throw new RuntimeException("Erro ao copiar imagem", e);
	}
}
G

Guevara, você fez os testes? Deu tudo certo? Acho que agora não deve dar mais erros.

Abraços

Guevara

Oi Garcia!!!
Desculpe a demora, além desta zica tô resolvendo outra para persistir um contato.
Testei a sua dica, mas continuo tomando NullPointerException:

15:26:03,961 DEBUG [DefaultRequestExecution] executing stack  DefaultRequestExecution
15:26:03,964 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor MultipartInterceptor
15:26:03,964 DEBUG [MultipartInterceptor] Trying to parse multipart request.
15:26:03,974 DEBUG [MultipartInterceptor] Using repository [/tmp] for file upload
15:26:04,029 DEBUG [MultipartInterceptor] Found [1] attributes in the multipart form submission. Parsing them.
15:26:04,073 DEBUG [VRaptorRequest      ] Setting imagem with [escuela_n1.jpg]
15:26:04,073 DEBUG [MultipartItemsProcessor] Uploaded file: imagem with [uploadedFile uploadedCompleteName=escuela_n1.jpg uploadedName=escuela_n1.jpg contentType=image/jpeg]
15:26:04,089 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor
15:26:04,090 DEBUG [DefaultResourceTranslator] trying to access /imovel/7/imagem
15:26:04,090 DEBUG [VRaptorRequest      ] Setting imovel.idImovel with [7]
15:26:04,090 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: ImagemController.uploadImagemController.upload(Imovel, UploadedFile)]
15:26:04,096 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor
15:26:04,098 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InterceptorListPriorToExecutionExtractor
15:26:04,111 DEBUG [InstantiatedInterceptorHandler] Invoking interceptor JPATransactionInterceptor
15:26:04,112 DEBUG [InstantiatedInterceptorHandler] Invoking interceptor NoCacheInterceptor
15:26:04,112 DEBUG [InstantiatedInterceptorHandler] Invoking interceptor InstantiateInterceptor
15:26:04,157 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ParametersInstantiatorInterceptor
15:26:04,157 DEBUG [AsmBasedTypeCreator ] Trying to make class for ImagemController$upload$[telefone removido]$8
15:26:04,158 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for ImagemController.upload(Imovel, UploadedFile) as [imovel, imagem]
15:26:04,158 DEBUG [AsmBasedTypeCreator ] Parameter names found for creating type are: [Imovel, Imagem]
15:26:04,158 DEBUG [AsmBasedTypeCreator ] Method for field 'Imovel' being defined for type Lbr/com/imobiliaria/bean/Imovel;
15:26:04,158 DEBUG [AsmBasedTypeCreator ] Method for field 'Imagem' being defined for type Lbr/com/caelum/vraptor/interceptor/multipart/UploadedFile;
15:26:04,159 DEBUG [AsmBasedTypeCreator ] Methods: [public void ImagemController$upload$[telefone removido]$8.setImovel(br.com.imobiliaria.bean.Imovel), public br.com.imobiliaria.bean.Imovel ImagemController$upload$[telefone removido]$8.getImovel(), public void ImagemController$upload$[telefone removido]$8.setImagem(br.com.caelum.vraptor.interceptor.multipart.UploadedFile), public br.com.caelum.vraptor.interceptor.multipart.UploadedFile ImagemController$upload$[telefone removido]$8.getImagem()]
15:26:04,159 DEBUG [AsmBasedTypeCreator ] Fields: [private br.com.imobiliaria.bean.Imovel ImagemController$upload$[telefone removido]$8.Imovel_, private br.com.caelum.vraptor.interceptor.multipart.UploadedFile ImagemController$upload$[telefone removido]$8.Imagem_]
15:26:04,160 DEBUG [CacheBasedTypeCreator] cached generic type for method [DefaultResourceMethod: ImagemController.uploadImagemController.upload(Imovel, UploadedFile)]
15:26:04,160 DEBUG [OgnlParametersProvider] Applying imagem with [escuela_n1.jpg]
15:26:04,167 DEBUG [OgnlParametersProvider] Applying imovel.idImovel with [7]
15:26:04,173 DEBUG [OgnlParametersProvider] cant find property for expression imovel.idImovel ignoring
15:26:04,173 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for ImagemController.upload(Imovel, UploadedFile) as [imovel, imagem]
15:26:04,173 DEBUG [ParametersInstantiatorInterceptor] Parameter values for [DefaultResourceMethod: ImagemController.uploadImagemController.upload(Imovel, UploadedFile)] are [br.com.imobiliaria.bean.Imovel@1ed957d, [uploadedFile uploadedCompleteName=escuela_n1.jpg uploadedName=escuela_n1.jpg contentType=image/jpeg]]
15:26:04,195 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor
15:26:04,195 DEBUG [ExecuteMethodInterceptor] Invoking ImagemController.upload(Imovel, UploadedFile)
25/04/2010 15:26:04 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
br.com.caelum.vraptor.InterceptionException: an exception was raised while executing resource method
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:86)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.imobiliaria.interceptor.NoCacheInterceptor.intercept(NoCacheInterceptor.java:41)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.util.jpa.JPATransactionInterceptor.intercept(JPATransactionInterceptor.java:46)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.multipart.MultipartInterceptor.intercept(MultipartInterceptor.java:98)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NullPointerException
	at br.com.imobiliaria.component.Imagens.salva(Imagens.java:52)
	at br.com.imobiliaria.controller.ImagemController.upload(ImagemController.java:49)
	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)
	... 44 more

Estou upando a imagem na jsp de edição de imóvel, pois lá têm a ID do imóvel, como está na apostila da Caelum.
Repare que o caminho só vai existir quando chegar a imagem ao componente Imagens, que no caso é a variável “destino”.
Tô há dias quebrando a cabeça pra entender o motivo de não setar a url nesta linha, o caminho não é gravado:

img.setUrlImagem(destino.getName());

Isso provoca a falha na linha seguinte que é esta:

imagemDAO.adiciona(img);

Tá osso, revirei o GUJ em busca de algum post mostrando como salvar o caminho no banco, e não achei nenhum, o pessoal não costuma postar o código com a solução, quando eu acho um post com a mesma dúvida que a minha, o post não têm nenhuma resposta, fica só a pergunta do autor. =/
Acho que se o pessoal respondesse com código explicando o funcionamento dele, muitos outros posts seriam evitados, inclusive o meu.
Nem no Google achei código mostrando como salvar caminho da imagem no banco usando VRaptor. Tô quase descartando essa funcionalidade de upload na minha aplicação, uma coisa que deveria ser simples mas tornou-se um enorme empecilho.
Grande abraço!!

G

Mas porque você não faz um debug no código para saber qual o objeto está nulo?

Guevara

Eu fiz aqui, coloquei um breakpoint na linha do img receber o destino e depois na linha do dao salvando o img, este é o resultado:

Para na linha do img recebendo o destino.
Aliás, o img não está recebendo a String de caminho do “destino”, esse é o problema.

img.setUrlImagem(destino.getName());
Guevara

É isso Garcia!

Não está setando o caminho.

Guevara

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!!

G

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

Guevara

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!!!

Guevara

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!!

Guevara

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!

V

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:

Rafael_Ferraro

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 ...
public List<File> 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");
    }
A baixo o método que recupero as imagens salvas no banco, ImagensDAO
public List<Imagens> listar(Imovel imovel) {
       
        return sessao.createCriteria(Imagens.class)
        .add(Restrictions.eq("imovel", imovel)).list();
    }

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!

Rafael_Ferraro

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

Criado 21 de abril de 2010
Ultima resposta 12 de ago. de 2013
Respostas 47
Participantes 4