(Resolvido) Upload com Vraptor

tira o $ do @Path:

@Get @Path("/admin/{produto.id}/editafoto")

[quote=Lucas Cavalcanti]tira o $ do @Path:

@Get @Path("/admin/{produto.id}/editafoto") [/quote]

Ok lucas deu certinho.
Agora vamos la
fiz este form.

           <form action="<c:url value="/admin/${produto.id}/imagem"/>" method="POST" enctype="multipart/form-data">
            <fieldset>
                    <legend>Editar Produto</legend>
                     <legend>Upload de Imagem</legend>
                     <input type="file" name="imagem" />

                     <button type="submit" name="_method" value="POST">Alterar</button>

Meu controler esta assim:

@Post @Path("/admin/{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());


}

Deveria funcionar assim nao e?

Mais nao funciona, quando o form a url vem assim:
http://localhost:8080/modular1/admin/7/editafoto

depois que eu pego a imagem e clico em alterar
ele retira o Id do produto e fica assim:
http://localhost:8080/modular1/admin//imagem
E nada acontece.

Alguma luz no fim do tuneo?
rsss

vc precisa incluir um produto no result, pra poder usar ${produto.id} no jsp pra gerar a url

Esse edita foto seu ai ta furado, vc tem que pegar o id do produto, o qual é o mesmo nome da foto, para poder achar a imagem,
tenta assim:

@Get @Path("/produtos/{id}/editaFoto")
	public Produto editaFoto(Integer id) {
		return dao.busca(id);
	}

Desculpa minha ignorância mais como eu faço isso?
Obrigado

assim como o well falou :wink:

Lucas mais eu fiz isso

    @Post @Path("/admin/{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());


}

sim, mas no método edita vc precisa fazer um:

result.include("produto", produto);

//ou

return produto;

[quote=Lucas Cavalcanti]sim, mas no método edita vc precisa fazer um:

[code]
result.include(“produto”, produto);

//ou

return produto;
[/code][/quote]
O Metodo edita na produtocontroller certo?

segue o metodo:

@Get @Path("/admin/{id}")
    public Produto edita(Long id) {
        return dao.carrega(id);
        
}

Onde eu colocaria este codigo que vc me passou?
Obrigado

bom, isso já deveria funcionar então… a menos que o dao.carrega(id); esteja retornando null

Olha meu Dao

public Produto carrega(Long id) {
        return (Produto) this.session.load(Produto.class, id);
}

ele esta retornando o produto nao?

no edita.jsp vc está colocando a url com ${produto.id} e não está indo?

deveria funcionar…

tenta imprimir as outras propriedades do produto e ver se sai alguma coisa…

vc tem o método getId na classe produto?

[quote=Lucas Cavalcanti]no edita.jsp vc está colocando a url com ${produto.id} e não está indo?

deveria funcionar…

tenta imprimir as outras propriedades do produto e ver se sai alguma coisa…

vc tem o método getId na classe produto?[/quote]
eu nao estou usando o arquivo edita.jsp estou usando um formulario so pra por a foto chamado editafoto.jsp

a url esta assim value="/admin/${produto.id}/imagem"

e sim tenho o getId

posta aqui a lógica editafoto()

eu tenho o edita foto la no ProdutoController para chamar o arquivo editafoto

ai quando vou enviar a foto eu uso o:

    @Post @Path("/admin/{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());
result.include("produto", produto);  


}

estou fazendo tudo errado ne?

tudo bem… mas cadê o editafoto do ProdutoController?

Ele so esta assim

       @Get @Path("/admin/{produto.id}/editafoto")
            public void editafoto() {

        }

então, a idéia é que vc precisa incluir o produto no result (como eu falei antes), senão vc não consegue chamar ${produto.id} no jsp.

faça isso:

@Get @Path("/admin/{produto.id}/editafoto")  
public Produto editafoto(Produto produto) {  
      return produto;
} 

se vc precisar acessar qqer outra propriedade fora o id do produto, use

return dao.carrega(produto.getId());

[quote=Lucas Cavalcanti]então, a idéia é que vc precisa incluir o produto no result (como eu falei antes), senão vc não consegue chamar ${produto.id} no jsp.

faça isso:

@Get @Path("/admin/{produto.id}/editafoto")  
public Produto editafoto(Produto produto) {  
      return produto;
} 

se vc precisar acessar qqer outra propriedade fora o id do produto, use

return dao.carrega(produto.getId()); [/quote]

valeu Lucas, pelo eu ainda aprendo este negocio rsss.
a 3 dias nunca havia falar em vraptor e sabia java de ouvir falar hauahuahuahaa. rss

agora ele esta apresentando o seguinte erro:


org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'imagensController': Unsatisfied dependency expressed through constructor argument with index 3 of type [br.com.caelum.goodbuy.modelo.Produto]: : No matching bean of type [br.com.caelum.goodbuy.modelo.Produto] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [br.com.caelum.goodbuy.modelo.Produto] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}

não é pra receber o produto no construtor, e sim no método.