VRaptor + Imagem + Rest [Resolvido]

7 respostas
worldsoft

Boa tarde galera,

Gostaria de saber por que o Vraptor não distingue o verbo usado na requisição quando tenho um formulário assim:

<form action="<c:url value="/product" />" method="post" enctype="multipart/form-data">
		ID: &lt;input type="text" name="product.id" value="${product.id }"/&gt;<br>
		Nome: &lt;input type="text" name="product.name" value="${product.name }"/&gt;<br>	
		Categoria: &lt;input type="text" name="product.category.id" value="${product.category.id }" /&gt;<br>
		
		<img /product/${product.id}/image"/>" width="100" height="100"/&gt;<br>
		&lt;input type="file" name="image"/&gt;<br>					
		&lt;button type="submit" name="_method" value="PUT"&gt;Salvar&lt;/button&gt;		
&lt;/form&gt;

Pois tenho uma URI “/product” com verbo “POST” e uma com verbo “PUT”, e quando dou um submit nesse formulário o verbo que o VRaptor está aceitando é o “POST” em vez do “PUT”, mais quando eu retiro:

enctype="multipart/form-data"

O VRaptor aceita o verbo certo o “PUT”, alguém pode me explicar o por que?

7 Respostas

wpivotto

worldsoft:
Boa tarde galera,

Gostaria de saber por que o Vraptor não distingue o verbo usado na requisição quando tenho um formulário assim:

&lt;form action="&lt;c:url value="/product" /&gt;" method="post" enctype="multipart/form-data"&gt;
		ID: &lt;input type="text" name="product.id" value="${product.id }"/&gt;<br>
		Nome: &lt;input type="text" name="product.name" value="${product.name }"/&gt;<br>	
		Categoria: &lt;input type="text" name="product.category.id" value="${product.category.id }" /&gt;<br>
		
		<img /product/${product.id}/image"/>" width="100" height="100"/&gt;<br>
		&lt;input type="file" name="image"/&gt;<br>					
		&lt;button type="submit" name="_method" value="PUT"&gt;Salvar&lt;/button&gt;		
&lt;/form&gt;

Pois tenho uma URI “/product” com verbo “POST” e uma com verbo “PUT”, e quando dou um submit nesse formulário o verbo que o VRaptor está aceitando é o “POST” em vez do “PUT”, mais quando eu retiro:

enctype="multipart/form-data"

O VRaptor aceita o verbo certo o “PUT”, alguém pode me explicar o por que?

Não funciona por causa da ordem de processamento da requisição no servidor (ele processa o multipart antes de analisar o _method) :cry:

worldsoft

Teria como mudar isso, ou teria uma outra forma, sem eu ter que criar um formulário especifico para esse problema.

Lucas_Cavalcanti

Você pode diferenciar pela URI e usar POST, não tem muito o que fazer infelizmente.

worldsoft

Lucas Cavalcanti:
Você pode diferenciar pela URI e usar POST, não tem muito o que fazer infelizmente.

Ok Lucas fiz o que você falou, mais está acontecendo algo diferente, o Objeto “Product” não está sendo instanciado, e mais uma vez isso acontece quando o enctype está definido no formulário.
Mais uma vez isso acontece pela sequencia que é processado as informações no servidor?
Terei que criar um formulário específico para submeter uma imagem?

worldsoft

Galera olha só tenho a seguinte jsp:

&lt;%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%&gt;
&lt;%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%&gt;

&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
	<img /product/${product.id}/image"/>" width="100" height="100"/&gt;
	&lt;form action="&lt;c:url value="/product/${product.id }/image"/&gt;" method="POST"
														enctype="multipart/form-data"&gt;			
		&lt;input type="file" name="image"/&gt;
		&lt;button type="submit"&gt;Enviar&lt;/button&gt;		
	&lt;/form&gt;
	&lt;form action="&lt;c:url value="/product" /&gt;" method="post"&gt;
		ID: &lt;input type="text" name="product.id" value="${product.id}"/&gt;<br>
		Nome: &lt;input type="text" name="product.name" value="${product.name}"/&gt;<br>	
		Categoria: &lt;input type="text" name="product.category.id" value="${product.category.id}" /&gt;<br>									
		&lt;button type="submit" name="_method" value="PUT"&gt;Salvar&lt;/button&gt;		
	&lt;/form&gt;					
&lt;/body&gt;
&lt;/html&gt;

e o seguinte controller:

@Post
	@Path("/product/{product.id}/image")
	public void uploadImage(Product product, final UploadedFile image){			
		this.validator.checking(new Validations(){{
			if(that(image, is(notNullValue()), "image", "image.null")){
				that(image.getContentType(), startsWith("image"), "image", "dont.is.image");
			}
		}});
		
		this.validator.onErrorRedirectTo(this).edit(product.getId());				
		this.dao.addImage(product, image);				
		this.result.redirectTo(this).edit(product.getId());		
	}

Mais toda vez que submento a esse controller “image” está sempre nulo.
Alguém pode me dizer o por que?

Lucas_Cavalcanti

A imagem que vc está submetendo é menor que 2MB (é o limite padrão do VRaptor)?

vc está com o commons-fileupload na pasta lib?

worldsoft

Lucas Cavalcanti:
A imagem que vc está submetendo é menor que 2MB (é o limite padrão do VRaptor)?

vc está com o commons-fileupload na pasta lib?

Value lucas funcionou.

Criado 29 de outubro de 2011
Ultima resposta 30 de out. de 2011
Respostas 7
Participantes 3