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: <input type="text" name="product.id" value="${product.id }"/><br>
Nome: <input type="text" name="product.name" value="${product.name }"/><br>
Categoria: <input type="text" name="product.category.id" value="${product.category.id }" /><br>
<img /product/${product.id}/image"/>" width="100" height="100"/><br>
<input type="file" name="image"/><br>
<button type="submit" name="_method" value="PUT">Salvar</button>
</form>
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?
[quote=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: <input type="text" name="product.id" value="${product.id }"/><br>
Nome: <input type="text" name="product.name" value="${product.name }"/><br>
Categoria: <input type="text" name="product.category.id" value="${product.category.id }" /><br>
<img /product/${product.id}/image"/>" width="100" height="100"/><br>
<input type="file" name="image"/><br>
<button type="submit" name="_method" value="PUT">Salvar</button>
</form>
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?[/quote]
Não funciona por causa da ordem de processamento da requisição no servidor (ele processa o multipart antes de analisar o _method) 
Teria como mudar isso, ou teria uma outra forma, sem eu ter que criar um formulário especifico para esse problema.
Você pode diferenciar pela URI e usar POST, não tem muito o que fazer infelizmente.
[quote=Lucas Cavalcanti]Você pode diferenciar pela URI e usar POST, não tem muito o que fazer infelizmente.
[/quote]
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?
Galera olha só tenho a seguinte jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<img /product/${product.id}/image"/>" width="100" height="100"/>
<form action="<c:url value="/product/${product.id }/image"/>" method="POST"
enctype="multipart/form-data">
<input type="file" name="image"/>
<button type="submit">Enviar</button>
</form>
<form action="<c:url value="/product" />" method="post">
ID: <input type="text" name="product.id" value="${product.id}"/><br>
Nome: <input type="text" name="product.name" value="${product.name}"/><br>
Categoria: <input type="text" name="product.category.id" value="${product.category.id}" /><br>
<button type="submit" name="_method" value="PUT">Salvar</button>
</form>
</body>
</html>
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?
A imagem que vc está submetendo é menor que 2MB (é o limite padrão do VRaptor)?
vc está com o commons-fileupload na pasta lib?
[quote=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?[/quote]
Value lucas funcionou.