Criar galeria de imagens com VRaptor 3 [Resolvido]

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.

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

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

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!

[quote=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![/quote]

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.

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

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

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

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

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

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

imagemDAO.adiciona(img);

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?

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


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, 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.

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!

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:

[code]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);
}

}[/code]

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

Abraços

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$1530240190$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$1530240190$8.setImovel(br.com.imobiliaria.bean.Imovel), public br.com.imobiliaria.bean.Imovel ImagemController$upload$1530240190$8.getImovel(), public void ImagemController$upload$1530240190$8.setImagem(br.com.caelum.vraptor.interceptor.multipart.UploadedFile), public br.com.caelum.vraptor.interceptor.multipart.UploadedFile ImagemController$upload$1530240190$8.getImagem()]
15:26:04,159 DEBUG [AsmBasedTypeCreator ] Fields: [private br.com.imobiliaria.bean.Imovel ImagemController$upload$1530240190$8.Imovel_, private br.com.caelum.vraptor.interceptor.multipart.UploadedFile ImagemController$upload$1530240190$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!!

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

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());

É isso Garcia!

Não está setando o caminho.