Bom dia!
Cara não esqueci de você não.
Estava implementando os metodos.
Mas sim, sobre a validação. Eu retirei da propria apostila fj-28 e não consegui. Peguei o metodo que você postou e não consegui resolver ainda.
Mas isso é o de menos.
Eu implementei igual a apostila. Mas não estou conseguindo.
O meu edita.jsp, ficou dessa forma. Está correto?
<form action="<c:url value="/produtos/${produto.id }"/>"method="POST">
<fieldset>
<legend>Editar Produto</legend>
<label for="nome">Nome:</label>
<input id="nome" type="text" name="produto.nome"
value="${produto.nome }"/>
<label for="descricao">Descrição:</label>
<textarea id="descricao" name="produto.descricao">
${produto.descricao }
</textarea>
<label for="preco">Preço:</label>
<input id="preco" type="text" name="produto.preco"
value="${produto.preco }"/>
<form action="<c:url value="/produtos/${produto.id }/imagem"/>"
method="POST" enctype="multipart/form-data">
<fieldset>
<legend>Upload de Imagem</legend>
<input type="file" name="imagem" />
<button type="submit">Enviar Imagem</button>
<button type="submit" name="_method" value="PUT">Enviar</button>
</fieldset>
</form>
O meu ImagemController ficou assim.
package br.com.caelum.goodbuy.controller;
import java.io.File;
import br.com.caelum.goodbuy.imagens.Imagens;
import br.com.caelum.goodbuy.modelo.Produto;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.interceptor.multipart.UploadedFile;
@Resource
public class ImagensController{
private final Validator validator;
private final Imagens imagens;
private final Result result;
public ImagensController(Validator validator,
Imagens imagens, Result result) {
this.validator = validator;
this.imagens = imagens;
this.result = result;
}
@Post("/produtos/{produto.id}/imagem")
public void upload(Produto produto,
final UploadedFile imagem) {
/*validator.checking(new Validations() {{
if (that(imagem, is(notNullValue()), "imagem",
"imagem.nula")) {
that(imagem.getContentType(),
startsWith("image"), "imagem", "nao.eh.imagem");
}
}});
validator
.onErrorRedirectTo(ProdutosController.class)
.edita(produto.getId());*/
imagens.salva(imagem, produto);
result.redirectTo(ProdutosController.class)
.edita(produto.getId());
}
@Get("/produtos/{produto.id}/imagem")
public File download(Produto produto) {
return imagens.mostra(produto);
}
}
E a minha imagens.java
package br.com.caelum.goodbuy.imagens;
import java.io.File;
import java.io.FileOutputStream;
import javax.servlet.ServletContext;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.goodbuy.modelo.Produto;
import br.com.caelum.vraptor.interceptor.multipart.UploadedFile;
import org.apache.commons.io.IOUtils;
@Component
public class Imagens {
private File pastaImagens;
public Imagens(ServletContext context) {
String caminhoImagens = context.getRealPath("/WEB-INF/imagens");
pastaImagens = new File(caminhoImagens);
pastaImagens.mkdir();
}
public void salva(UploadedFile imagem, Produto produto) {
File destino = new File(pastaImagens, produto.getId() + ".imagem");
try {
IOUtils.copy(imagem.getFile(), new FileOutputStream(destino));
} catch (Exception e) {
throw new RuntimeException("Erro ao copiar imagem", e);
}
}
public File mostra(Produto produto) {
return new File(pastaImagens, produto.getId() + ".imagem");
}
}
Já criei a pasta imagens no Web-inf.
Na tela de editar ficaram dois botões.
Um eu coloquei enviar imagem, e o outro enviar para enviar as alterações do conteudo do produto.
Quando eu clico em enviar do produto, funciona corretamente.
Agora, quando eu clico em enviar imagem.
Aparece.
he specified HTTP method is not allowed for the requested resource ().
Me ajuda ai.
Valeu.