VRaptor Erro upload de arquivo

O parâmetro sempre chega com null. Estou usando o tomcat 7

public void upload(UploadedFile imagem) {
        if (imagem != null) {
            try {
                File root = new File(contexto.getRealPath("/"));

                File dir = new File(root.getCanonicalPath() + File.separator + "imagens/");
                IOUtils.copy(imagem.getFile(), new FileOutputStream(new File(dir.getName(), imagem.getFileName())));

                result.forwardTo(this).exibe();
            } catch (IOException ex) {
                LOG.error("Erro efetuando o upload do arquivo. " + ex.getMessage());
                result.forwardTo(ErroController.class).form("Erro efetuando o upload do arquivo. " + ex.getMessage());
            }
        } else {
            LOG.error("Arquivo em branco ou nulo." );
            result.forwardTo(ErroController.class).form("Arquivo em branco ou nulo.");
        }
    }

<form action="<c:url value="/upload/enviar" />" enctype="multipart/form-data" method="post">
                    <input type="file" name="imagem"/><br/>
                    <input type="submit" value="Enviar" />
                </form> 

tenta colocar o commons-fileupload no classpath.

Já esta. Já tinha visto isso em outros posts. Será que o problema é com o tomcat 7?

tenta habilitar os logs do vraptor e ver se aparece alguma informação

A única mensagem no LOG padrão é essa: Request contains multipart data. Try to parse with Servlet3 Part.

Vou tentar alterar o nível de log.

O log esta com essa informação:

14:03:57,265 DEBUG [LazyInterceptorHandler.execute] () Invoking interceptor ParametersInstantiatorInterceptor
14:03:57,273 DEBUG [ParanamerNameProvider.parameterNamesFor] () Found parameter names with paranamer for EmailUploadController.upload(UploadedFile) as [imagem]
14:03:57,289 DEBUG [ParametersInstantiatorInterceptor.intercept] () Parameter values for [DefaultResourceMethod: EmailUploadController.uploadEmailUploadController.upload(UploadedFile)] are [null]
14:03:57,290 DEBUG [DefaultListableBeanFactory.createBean] () Creating instance of bean 'executeMethodInterceptor’
14:03:57,293 DEBUG [DefaultListableBeanFactory.createBean] () Finished creating instance of bean 'executeMethodInterceptor’
14:03:57,293 DEBUG [ToInstantiateInterceptorHandler.execute] () Invoking interceptor ExecuteMethodInterceptor
14:03:57,293 DEBUG [ExecuteMethodInterceptor.intercept] () Invoking EmailUploadController.upload(UploadedFile)
14:03:57,294 ERROR [EmailUploadController.upload] () Arquivo em branco ou nulo.

vc está com o vraptor mais novo? (o 3.4.1)

se sim, verifica se o commons-fileupload está em WEB-INF/lib, pq o vraptor tá usando o upload do servlet 3, que não funciona no tomcat 7 com filtros, e ele deveria estar usando o fileupload.

O problema era o true

    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.2.1</version>         
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-io</artifactId>
        <version>1.3.2</version>            
        <optional>true</optional>
    </dependency>

Retirei o true e funcionou!!! MUITO OBRIGADO!!

Como o Lucas falou, isso é uma issue tanto do Tomcat 7 quanto do JBoss web. Isso porque a especificação do Servlet 3 não é clara se o Multipart support é apenas para Servlets ou para Filters também. Sendo assim a implementação inicial no Tomcat foi apenas para Servlets. Isso foi corrigido nas últimas versões do Tomcat, não lembro qual. Porém o JBoss web permanece sem suporte ao Multipart para Filters.

Em todos os outros appservers, como o Glassfish 3+ o suporte a Servlet Parts funciona perfeitamente.

O ideal nestas versões é usar o bom e velho (muito velho) commons-fileupload.