Vraptor + upload (Resolvido)

Oi Pessoal,

Estou usando o upload do vraptor explicado na documentação.
Quando informo um arquivo no form tudo ocorre bem como previsto.
Porém quando deixo a informação em branco, ou seja não tenho arquivo para fazer upload, o que pode ocorrer dependendo do caso, a validação é acionada. Me parece que o VRaptor adiciona uma mensagem no objeto Validator: “Invalid upload”.
Existe uma forma da validação aceitar o UploadedFile nulo? Ou estou fazendo algo errado?

Obrigado.

se vc não selecionar nenhum arquivo no input file deveria ir como null…

Isso mesmo, ele vem como nulo e aparentemente o VRaptor adiciona uma mensagem no objeto Validator: “Invalid upload”.

Só que no meu caso não poderia adicionar essa mensagem, em alguns casos eu não anexo imagem.

ele só adiciona essa mensagem se vc manda um arquivo muito grande…

habilita o log do vraptor e ve se não dá outra mensagem mais útil…

00:56:26,110 DEBUG VRaptor:81 - VRaptor received a new request
00:56:26,110 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor ResourceLookupInterceptor
00:56:26,110 DEBUG DefaultResourceTranslator:51 - trying to access /imagem/gravar
00:56:26,111 DEBUG DefaultResourceTranslator:61 - found resource [DefaultResourceMethod: ImagemController.gravarImagemController.gravar(Imagem, UploadedFile)]
00:56:26,112 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor HibernateTransactionInterceptor
00:56:26,115 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor FlashInterceptor
00:56:26,116 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor CommonsUploadMultipartInterceptor
00:56:26,116 INFO CommonsUploadMultipartInterceptor:93 - Request contains multipart data. Try to parse with commons-upload.
00:56:26,175 DEBUG CommonsUploadMultipartInterceptor:175 - Using repository /var/folders/QW/QWzSirLAGCiCI8EsqMbCgU+++TI/-Tmp- for file upload
00:56:26,205 DEBUG CommonsUploadMultipartInterceptor:102 - Found 9 attributes in the multipart form submission. Parsing them.
00:56:26,239 DEBUG CommonsUploadMultipartInterceptor:119 - A file field was empty: arquivoImagem
00:56:26,239 DEBUG CommonsUploadMultipartInterceptor:111 - imagem.mensagem is a field
00:56:26,241 DEBUG CommonsUploadMultipartInterceptor:111 - imagem.id is a field
00:56:26,241 DEBUG CommonsUploadMultipartInterceptor:111 - imagem.endereco is a field
00:56:26,241 DEBUG CommonsUploadMultipartInterceptor:111 - imagem.pagina.id is a field
00:56:26,241 DEBUG CommonsUploadMultipartInterceptor:111 - imagem.cliente.id is a field
00:56:26,242 DEBUG CommonsUploadMultipartInterceptor:111 - imagem.dataInclusao is a field
00:56:26,242 DEBUG CommonsUploadMultipartInterceptor:111 - imagem.dataAlteracao is a field
00:56:26,242 DEBUG CommonsUploadMultipartInterceptor:111 - imagem.status is a field
00:56:26,262 DEBUG VRaptorRequest:86 - Setting imagem.mensagem with [Lagaffe]
00:56:26,263 DEBUG VRaptorRequest:86 - Setting imagem.id with []
00:56:26,263 DEBUG VRaptorRequest:86 - Setting imagem.endereco with []
00:56:26,263 DEBUG VRaptorRequest:86 - Setting imagem.pagina.id with [1]
00:56:26,263 DEBUG VRaptorRequest:86 - Setting imagem.cliente.id with [1]
00:56:26,264 DEBUG VRaptorRequest:86 - Setting imagem.dataInclusao with [21/08/2012]
00:56:26,264 DEBUG VRaptorRequest:86 - Setting imagem.dataAlteracao with []
00:56:26,264 DEBUG VRaptorRequest:86 - Setting imagem.status with [ESPERA]
00:56:26,265 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor ExceptionHandlerInterceptor
00:56:26,265 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor InstantiateInterceptor
00:56:26,265 DEBUG IogiParametersProvider:56 - IogiParametersProvider is up
00:56:26,266 DEBUG LazyInterceptorHandler:58 - Invoking interceptor ParametersInstantiatorInterceptor
00:56:26,267 DEBUG ParanamerNameProvider:51 - Found parameter names with paranamer for ImagemController.gravar(Imagem, UploadedFile) as [imagem, arquivoImagem]
00:56:26,268 DEBUG IogiParametersProvider:69 - getParametersFor() called with parameters Parameters(Parameter(imagem.dataAlteracao -> ), Parameter(imagem.dataInclusao -> 21/08/2012), Parameter(imagem.id -> ), Parameter(imagem.pagina.id -> 1), Parameter(imagem.endereco -> ), Parameter(imagem.mensagem -> Lagaffe), Parameter(imagem.status -> ESPERA), Parameter(imagem.cliente.id -> 1)) and targets [Target(name=imagem, type=class br.com.pagina.modelo.Imagem), Target(name=arquivoImagem, type=interface br.com.caelum.vraptor.interceptor.multipart.UploadedFile)].
00:56:26,269 DEBUG ParanamerNameProvider:51 - Found parameter names with paranamer for Imagem() as []
00:56:26,270 DEBUG ParanamerNameProvider:51 - Found parameter names with paranamer for Cliente() as []
00:56:26,276 DEBUG ParanamerNameProvider:51 - Found parameter names with paranamer for Pagina() as []
00:56:26,282 WARN UploadedFileConverter:51 - There was an error when uploading the file {}. Please verify if commons-fileupload jars are in your classpath or you are using a Servlet 3 Container.
00:56:26,298 DEBUG ParametersInstantiatorInterceptor:88 - There are conversion errors: [ValidationMessage{category=arquivoImagem, message=Invalid upload, parameters=null}]
00:56:26,298 DEBUG ParametersInstantiatorInterceptor:90 - Parameter values for [DefaultResourceMethod: ImagemController.gravarImagemController.gravar(Imagem, UploadedFile)] are [br.com.pagina.modelo.Imagem@38af98ac, null]
00:56:26,299 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor ExecuteMethodInterceptor
00:56:26,299 DEBUG ExecuteMethodInterceptor:60 - Invoking ImagemController.gravar(Imagem, UploadedFile)
00:56:26,330 DEBUG JSR303Validator:69 - there are 0 violations at bean br.com.pagina.modelo.Imagem@38af98ac.
00:56:26,331 DEBUG ParanamerNameProvider:51 - Found parameter names with paranamer for ImagemController.gravar(Imagem, UploadedFile) as [imagem, arquivoImagem]
00:56:26,342 DEBUG CglibProxifier:74 - a proxy for interface br.com.caelum.vraptor.view.LogicResult is created as class br.com.caelum.vraptor.view.LogicResult$$EnhancerByCGLIB$$9fe938e1
00:56:26,374 DEBUG CglibProxifier:74 - a proxy for class br.com.pagina.controller.ImagemController is created as class br.com.pagina.controller.ImagemController$$EnhancerByCGLIB$$25c236c
00:56:26,376 DEBUG CglibProxifier:74 - a proxy for class br.com.pagina.controller.ImagemController is created as class br.com.pagina.controller.ImagemController$$EnhancerByCGLIB$$25c236c
00:56:26,377 DEBUG DefaultLogicResult:88 - Executing ImagemController.formulario()
00:56:26,377 DEBUG DefaultLogicResult:100 - Forwarding to /WEB-INF/jsp/imagem/formulario.jsp
00:56:26,378 DEBUG DefaultStaticContentHandler:68 - Deferring request to container: /pagina/WEB-INF/jsp/imagem/formulario.jsp
00:56:26,389 DEBUG VRaptor:95 - VRaptor ended the request
00:56:26,696 DEBUG VRaptor:81 - VRaptor received a new request
00:56:26,696 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor ResourceLookupInterceptor
00:56:26,697 DEBUG VRaptor:95 - VRaptor ended the request

Obs.: o jar “commons-fileupload” está no projeto.

Talvez esteja acontecendo um erro de conversão nos outros atributos… tenta apagar os outros inputs do form e deixar só o input file

Dexei só o input file e o problema continua :frowning:

Log sem arquivo:

11:38:05,404 DEBUG VRaptor:81 - VRaptor received a new request
11:38:05,405 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor ResourceLookupInterceptor
11:38:05,405 DEBUG DefaultResourceTranslator:51 - trying to access /imagem/gravar
11:38:05,406 DEBUG DefaultResourceTranslator:61 - found resource [DefaultResourceMethod: ImagemController.gravarImagemController.gravar(Imagem, UploadedFile)]
11:38:05,406 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor HibernateTransactionInterceptor
11:38:05,412 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor ExceptionHandlerInterceptor
11:38:05,412 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor CommonsUploadMultipartInterceptor
11:38:05,412 INFO CommonsUploadMultipartInterceptor:93 - Request contains multipart data. Try to parse with commons-upload.
11:38:05,413 DEBUG CommonsUploadMultipartInterceptor:175 - Using repository /var/folders/QW/QWzSirLAGCiCI8EsqMbCgU+++TI/-Tmp- for file upload
11:38:05,413 DEBUG CommonsUploadMultipartInterceptor:102 - Found 1 attributes in the multipart form submission. Parsing them.
11:38:05,414 DEBUG CommonsUploadMultipartInterceptor:119 - A file field was empty: arquivoImagem
11:38:05,414 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor FlashInterceptor
11:38:05,414 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor InstantiateInterceptor
11:38:05,414 DEBUG IogiParametersProvider:56 - IogiParametersProvider is up
11:38:05,415 DEBUG LazyInterceptorHandler:58 - Invoking interceptor ParametersInstantiatorInterceptor
11:38:05,415 DEBUG ParanamerNameProvider:51 - Found parameter names with paranamer for ImagemController.gravar(Imagem, UploadedFile) as [imagem, arquivoImagem]
11:38:05,416 DEBUG IogiParametersProvider:69 - getParametersFor() called with parameters Parameters() and targets [Target(name=imagem, type=class br.com.pagina.modelo.Imagem), Target(name=arquivoImagem, type=interface br.com.caelum.vraptor.interceptor.multipart.UploadedFile)].
11:38:05,416 DEBUG ParanamerNameProvider:51 - Found parameter names with paranamer for Imagem() as []
11:38:05,417 WARN UploadedFileConverter:51 - There was an error when uploading the file {}. Please verify if commons-fileupload jars are in your classpath or you are using a Servlet 3 Container.
11:38:05,418 DEBUG ParametersInstantiatorInterceptor:88 - There are conversion errors: [ValidationMessage{category=arquivoImagem, message=Invalid upload, parameters=null}]
11:38:05,419 DEBUG ParametersInstantiatorInterceptor:90 - Parameter values for [DefaultResourceMethod: ImagemController.gravarImagemController.gravar(Imagem, UploadedFile)] are [br.com.pagina.modelo.Imagem@1786b2ca, null]
11:38:05,419 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor ExecuteMethodInterceptor
11:38:05,419 DEBUG ExecuteMethodInterceptor:60 - Invoking ImagemController.gravar(Imagem, UploadedFile)
11:38:05,420 DEBUG ParanamerNameProvider:51 - Found parameter names with paranamer for ImagemController.gravar(Imagem, UploadedFile) as [imagem, arquivoImagem]
11:38:05,421 DEBUG CglibProxifier:74 - a proxy for interface br.com.caelum.vraptor.view.LogicResult is created as class br.com.caelum.vraptor.view.LogicResult$$EnhancerByCGLIB$$4e58f788
11:38:05,422 DEBUG DefaultLogicResult:123 - redirecting to class ImagemController
11:38:05,422 DEBUG CglibProxifier:74 - a proxy for class br.com.pagina.controller.ImagemController is created as class br.com.pagina.controller.ImagemController$$EnhancerByCGLIB$$b0cbe213
11:38:05,423 DEBUG CglibProxifier:74 - a proxy for class br.com.pagina.controller.ImagemController is created as class br.com.pagina.controller.ImagemController$$EnhancerByCGLIB$$b0cbe213
11:38:05,424 DEBUG DefaultLogicResult:138 - redirecting to /pagina/imagem/nova
11:38:05,426 DEBUG VRaptor:95 - VRaptor ended the request

log informando um arquivo:

11:42:50,124 DEBUG VRaptor:81 - VRaptor received a new request
11:42:50,165 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor ResourceLookupInterceptor
11:42:50,166 DEBUG DefaultResourceTranslator:51 - trying to access /imagem/gravar
11:42:50,166 DEBUG DefaultResourceTranslator:61 - found resource [DefaultResourceMethod: ImagemController.gravarImagemController.gravar(Imagem, UploadedFile)]
11:42:50,167 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor HibernateTransactionInterceptor
11:42:50,170 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor ExceptionHandlerInterceptor
11:42:50,170 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor CommonsUploadMultipartInterceptor
11:42:50,170 INFO CommonsUploadMultipartInterceptor:93 - Request contains multipart data. Try to parse with commons-upload.
11:42:50,171 DEBUG CommonsUploadMultipartInterceptor:175 - Using repository /var/folders/QW/QWzSirLAGCiCI8EsqMbCgU+++TI/-Tmp- for file upload
11:42:50,172 DEBUG CommonsUploadMultipartInterceptor:102 - Found 1 attributes in the multipart form submission. Parsing them.
11:42:50,173 DEBUG CommonsUploadMultipartInterceptor:115 - arquivoImagem is a file
11:42:50,224 DEBUG VRaptorRequest:86 - Setting arquivoImagem with [arquivoImagem]
11:42:50,225 DEBUG CommonsUploadMultipartInterceptor:165 - Uploaded file: arquivoImagem with [uploadedFile uploadedCompleteName=Lagaffe.gif uploadedName=Lagaffe.gif contentType=image/gif]
11:42:50,225 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor FlashInterceptor
11:42:50,225 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor InstantiateInterceptor
11:42:50,226 DEBUG IogiParametersProvider:56 - IogiParametersProvider is up
11:42:50,226 DEBUG LazyInterceptorHandler:58 - Invoking interceptor ParametersInstantiatorInterceptor
11:42:50,227 DEBUG ParanamerNameProvider:51 - Found parameter names with paranamer for ImagemController.gravar(Imagem, UploadedFile) as [imagem, arquivoImagem]
11:42:50,227 DEBUG IogiParametersProvider:69 - getParametersFor() called with parameters Parameters(Parameter(arquivoImagem -> arquivoImagem)) and targets [Target(name=imagem, type=class br.com.pagina.modelo.Imagem), Target(name=arquivoImagem, type=interface br.com.caelum.vraptor.interceptor.multipart.UploadedFile)].
11:42:50,228 DEBUG ParanamerNameProvider:51 - Found parameter names with paranamer for Imagem() as []
11:42:50,238 DEBUG ParametersInstantiatorInterceptor:90 - Parameter values for [DefaultResourceMethod: ImagemController.gravarImagemController.gravar(Imagem, UploadedFile)] are [br.com.pagina.modelo.Imagem@1d2fa9ae, [uploadedFile uploadedCompleteName=Lagaffe.gif uploadedName=Lagaffe.gif contentType=image/gif]]
11:42:50,239 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor ExecuteMethodInterceptor
11:42:50,239 DEBUG ExecuteMethodInterceptor:60 - Invoking ImagemController.gravar(Imagem, UploadedFile)
11:42:54,806 DEBUG CglibProxifier:74 - a proxy for interface br.com.caelum.vraptor.view.LogicResult is created as class br.com.caelum.vraptor.view.LogicResult$$EnhancerByCGLIB$$4e58f788
11:42:54,812 DEBUG CglibProxifier:74 - a proxy for class br.com.pagina.controller.ImagemController is created as class br.com.pagina.controller.ImagemController$$EnhancerByCGLIB$$b0cbe213

Eu mudei do iogi para o ognl e o problema desapareceu!

cadastra um bug lá no VRaptor por favor:

Pronto, cadastrado.

Obrigado Lucas.

tento resolver assim que possível… se quiser implementar você mesmo, é muito bem-vindo =)

O problema é que o vraptor sempre espera um arquivo. Analisando o código do UploadedFileConverter, há a validação:

if (upload == null) throw new ConversionError("Invalid upload");

Talvez seja necessário remover esse IF e fazer a validação do upload de outra forma.

Fixed.