Busca fácil - FJ28

10 respostas
101574

Bom dia Galera,

Estou implementando o exemplo da apostila fj-28.
E esse metodo não funciona.

public void busca(String nome) {
result.include("nome", nome);
result.use(representation())
.from(dao.busca(q), "produtos")
.exclude("id", "descricao")
.serialize();
}

Alguém poderia me ajudar.
Cópie ele da própria apostila.

10 Respostas

Renato_Yury

Saudações meu caro

Finalizei esta apostila agora pouco, não vi dificuldade para implementar essa parte não.

Fez passo a passo até calejar?

Dê mais detalhes do problema que ocorreu.

101574

Bom dia meu jovem!

Pois é, fiz esse código, mas ele está dando erro.

Na linha 3 e 4.
Teria como você me ajudar?
Já que você conseguiu implementar ela toda.
Como fica a parte de upload da imagem?
Ela é salva na inclusão, não entendi muito bem.

Se possível, teria como você me mandar o .zip da aplicação?

Agradeço.

Renato_Yury

A inserção da imagem é feita pelo form Edita.

Na classe Imagens existe a String CaminhoImagens,

String caminhoImagens = context.getRealPath("/WEB-INF/imagens");

crie uma pasta (folder) referente ao endereço.
Aqui no meu aconteceu o seguinte fui inserindo as imagens e funcionou tranquilo, quando eu reiniciei a aplicação as imagens sumiram e apareceu no console o erro referente a elas, programa procurando as imagens e não encontrava. Daí eu coloquei manualmente na pasta Imagens, e renomiei o arquivo tirando a extenção. A imagem deve estar nomeada pelo"id" do produto seguido de “.imagem”. Ex: Para o produto id=1 deve estar nomeada a imagem 1.imagem

Vê se é isto aqui…

Vc precisa adicionar o commons-fileupload e o commons-io pra habilitar o upload
Certifique que estes estão na pasta lib.

Está fazendo a validação!?
Se Estiver eu tive problemas com este modelo de validação da apostila na classe ImagensController. Foi só tirar a validação que funcionou.

101574

Cara,

Você não sabe o quanto me ajudou.
E justamente na validação que esta dando erro.
Vou implementar, e volto aqui.
Poww valeu mesmo.

Renato_Yury

Hein…

Não conformado com essa situação da validação da imagem sai procurando e encontrei uma atualização da apostila fj28.

http://www.caelum.com.br/download/caelum-java-web-vraptor-hibernate-ajax-fj28.pdf

essa funciona a validação. Segue trecho do código.

@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());
    }
}

Outro detalhe

Quando vc sai do eclipse e entra novamente as imagens somem?

101574

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.

Renato_Yury

Cara dei uma olhada rapida aqui tá corrido hoje pro meu lado mas eu não encontrei o botão de enviar a atualização do produto, dentro do form Edita, que seria este:

<button type="submit" name="_method" value="PUT">Enviar</button>

Vc colocou ele no final? ou está um form dentro de outro?

O form Upload de Imagem é outro papo, tem que ter o form próprio.
Ele está no editar justamente por que o produto para ter uma imagem ele precisa de ter antes um id, ele precisa existir.

<form id="produtosForm" action="<c:url value="/produtos/${produto.id }"/>" method="POST">
			<fieldset>
				<legend>Edita Produto</legend>
					<input type="text" name="produto.id" value="${produto.id}"/>
					
					<label for="nome">Nome:</label>
					<input 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 type="text" name="produto.preco" value="${produto.preco}"/>
					
					<button type="submit" name="_method" value="PUT">Enviar</button>
			</fieldset>
		</form>

<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><br>
				
				<img src="<c:url value="/produtos/${produto.id}/imagem"/>" width="120" height="120"/>
			</fieldset>
		</form>
101574

Poww brother.
Está dando erro.

Erro ao copiar imagem

Estava dentro o meu enviar do form. Retirei, igual você mandou mas não adiantou.
Valeu.
Vou continuar tentando.
Se tiver alguma ideia…

Flw.

V

Descobriu?

To com a mesma dúvida =(

abrass.

101574

Consegui sim!

Onde está dando o erro?
Eu estava colocando um método no lugar errado.

Flw.

Criado 27 de agosto de 2012
Ultima resposta 17 de out. de 2012
Respostas 10
Participantes 3