Problema com enctype="multipart/form-data" vraptor 3.2 [RESOLVIDO]

Outro problema que estou enfrentando é que quando adiciono o atributo enctype=“multipart/form-data” meu objeto chega null no controlador e quando tiro o atributo ele chega corretamente …estranho alguma luz??

isso funcionava antes…

<form action="/tag/save" method="post" enctype="multipart/form-data">
	<input name="mother.name" value="${mother.name}"/>
	<input type="submit">
</form>
package br.com.jslsolucoes.tagria.controllers;

@Resource
public class IndexController {

	@Post
	@Path("/save")
	public void saveOrUpdate(Mother mother) {
		System.out.println(mother);
	}
}

Isso porque multipart/form-data é quando você quer fazer um upload de arquivos. Para formulários normais deve ser usado application/x-www-form-urlencoded.

Bom isso nao deveria interferir em nada ate pq funcionava normalmente em versoes anteriores na 3.1.3 por exemplo!!!

Pois se nao me engano tem que ser multipart pois utilizo names em campos do tipo “classe.atributolist[].name” que precisam do multipart/form-data pra funcionar e mesmo assim nao teria porque vir null pois mesmo usando o upload vem null tudo apenas com a mudança do atributo enctype,tem algum problema ai !!!

multipart só serve pro upload mesmo, não é necessário pros nomes de campos do jeito q vc falou…

de qqer forma deveria continuar funcionando sim. Em que servidor vc tá rodando a aplicação? é um q suporta Servlet 3.0?
se sim, tinha um bug que o garcia-jj já corrigiu e o fix está no último snapshot:
http://oss.sonatype.org/content/repositories/snapshots/br/com/caelum/vraptor/3.2.1-SNAPSHOT/

Lucas, você está certo quando ao multipart. Ele é apenas para upload, e pode ser lido aqui: http://tools.ietf.org/rfc/rfc1867.txt

O bug na verdade era uma prevenção, já que o único container/appserver que implementa upload é o GlassfishV3. Há um bug no Tomcat 7.0.2, que ainda é um beta, que ignora upload quando você está em um filter, aceitando upload apenas de servlets. Como o Vraptor possui um filter, o upload falha. Essa semana vou enviar um email para a lista do tomcat para saber melhor sobre isso.

[quote=Lucas Cavalcanti]multipart só serve pro upload mesmo, não é necessário pros nomes de campos do jeito q vc falou…

de qqer forma deveria continuar funcionando sim. Em que servidor vc tá rodando a aplicação? é um q suporta Servlet 3.0?
se sim, tinha um bug que o garcia-jj já corrigiu e o fix está no último snapshot:
http://oss.sonatype.org/content/repositories/snapshots/br/com/caelum/vraptor/3.2.1-SNAPSHOT/[/quote]

Tomcat 6.0.29 que estou rodando…vou baixar o ultimo snapshot e testar e ja dou o feedback…

Bom lucas descobri o problema!!!

O problema só ocorre quanto não incluo a commons-file-upload na minha lib e uso enctype=“multipart/form-data” o teste sem a lib chega nulll e se incluo a lib funciona normalmente … estou usando o tomcat 6.0.29 que nao implementa a servlet 3 ainda…entao o bug que o garcia arrumou nao se referia a isso …

um jeito é colocar a lib commons-file-upload na pasta de mandatory por enquanto … ou ver pq isso ocorre e o que essa lib influencia internamente…

Abraços…

boneazul, isso está na documentação. Para usar upload você precisa dos jars commons-fileupload e commons-io.

http://vraptor.caelum.com.br/documentacao/download-e-upload/

Talvez uma coisa que seja interessante é colocar um warning quando alguém tenta fazer um upload sem ter os jars necessários ou não estar em um container com servlet3.

[quote=garcia-jj]boneazul, isso está na documentação. Para usar upload você precisa dos jars commons-fileupload e commons-io.

http://vraptor.caelum.com.br/documentacao/download-e-upload/

Talvez uma coisa que seja interessante é colocar um warning quando alguém tenta fazer um upload sem ter os jars necessários ou não estar em um container com servlet3.[/quote]

Concordo com esse warning que pode ser quando ele receber um post com multipart/form-data e nao ter a common-upload ou commons-io no path, senao fica sem feedback pra quem desenvolve pois nao ocorre nenhum erro e nao funciona como deveria no meu caso vindo os “null” e fica quebrando a cabeça achando que o culpado é algo diferente que ele possa ter feito…

Abraços…

abre uma issue lá por favor:

[quote=Lucas Cavalcanti]abre uma issue lá por favor:
http://github.com/caelum/vraptor/issues[/quote]

Eu tive o mesmo problema hj.
É porque na versão 3.1.3 do vraptor o commons-fileupload era obrigatório ai quando eu atualizei o vraptor hj parou de funcionar o upload pq eu não tinha declarado o commons-fileupload no ivy.xml.

Seria interessante colocar essa informação no release notes dessa versão talvez.

é que o uploading é opcional há algum tempo, a gente só não tinha atualizado o pom.xml…

atualiza lá no seu fork por favor, rodolfo?

Hoje a noite vou fazer essa coisa do warning. Tem mais alguma coisa que é necessário no upload?

Vou aproveitar e ver o que precisa ser atualizado na documentação.

blz Lucas vou adicionar no meu fork e mandar o pull request.

obrigado garcia e rodolfo =)

Lucas, esqueci de perguntar. Será que realmente é interessante alterar o componente NullUploadInterceptor para adicionar um warn?

Por um lado atualmente o componente é Lazy, sendo assim o custo de ter ele em memória é quase nulo. Mas se colocarmos esse warn vou precisar adicionar um request lá, remover o lazy e a partir disso fazer um request.getContentType().startsWith(“multipart/form-data”).

Sendo assim teremos um custo maior em cada requisição, embora que pequeno, já que o componente precisará ser RequestScoped.

A documentação é bem clara que precisa ter o commons-upload para funcionar corretamente o upload. Acho que o ideal é melhorar a documentação daquela página, que inclusive preciso atualizar as informações sobre o upload com Servlet 3.

O que vocês acham?

[quote=garcia-jj]Lucas, esqueci de perguntar. Será que realmente é interessante alterar o componente NullUploadInterceptor para adicionar um warn?

Por um lado atualmente o componente é Lazy, sendo assim o custo de ter ele em memória é quase nulo. Mas se colocarmos esse warn vou precisar adicionar um request lá, remover o lazy e a partir disso fazer um request.getContentType().startsWith(“multipart/form-data”).

Sendo assim teremos um custo maior em cada requisição, embora que pequeno, já que o componente precisará ser RequestScoped.

A documentação é bem clara que precisa ter o commons-upload para funcionar corretamente o upload. Acho que o ideal é melhorar a documentação daquela página, que inclusive preciso atualizar as informações sobre o upload com Servlet 3.

O que vocês acham?[/quote]

Bom na minha opinião então eu colocaria a commons-upload como required na distribuição…ja que esse “custo” de não ser lazy é notavel …acho que não tem muita saída…
o que na minha opinião não pode é o framework ficar sem feedback de um corportamento como esse …e não é pq eu tenho definido como “multipart/form-data” que sou obrigado a colocar objeto input file que foi o meu caso que fiquei dois dias quebrando a cabeça e vendo pq as entidades que nada tinha a ver com upload estavam vindo null…isso é afetando coisas que nao deveriam…essa é minha opinião…

outra alternativa é colocar um logger.warn na hora que o VRaptor escolhe o NullMultipartInterceptor, que é na inicialização do servidor… isso já é o suficiente?

mas vc tem razão, boneazul, desculpe pelo inconveniente e obrigado pelo feedback.

Ignore meu pull-request. Vou fazer dessa outra forma.