(Resolvido) Upload com Vraptor

Galera olha este metodo.

public void salva(UploadedFile imagem, Produto produto) {
            File destino = new File(pastaImagens, produto.getId() + ".imagem");
            try {
                IOUtils.copyLarge(imagem.getFile(), new FileOutputStream(destino));
            }catch (IOException e) {
                throw new RuntimeException("Erro ao copiar imagem", e);
            }

A parte que tem o

[code]
IOUtils.copyLarge(imagem.getFile(), new FileOutputStream(destino));

[quote]
Nao compila o erro aparece no coptLarge.
Alguem ai sabe onde estou errando?

Galera era o import, peguei o da pasta do Vraptor e funcionou
Obrigado

Vamos a outro erro.

No metodo de upload

@Post @Path("/admin/{produto.id}/imagem")
       public void upload(Produto produto, 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());
}

Este trecho nao compila

  if (that(imagem, is(notNullValue()), "imagem", "imagem.nula")) {
                that(imagem.getContentType(), startsWith("image"), "imagem", "nao.eh.imagem");

No netbeans ao clicar nas dicas ele pede para tornar como final o UploadedFile imagem faço isso e nada acontece
Alguem ai sabe oque fazer?

você precisa de um import estático em org.hamcrest.Matchers.* pra esse código funcionar

Pesquisando no forum eu importei a biblioteca hancrest e o erro sumiu

mais agora na hora de subir o glasfihs ele da o seguinte erro na biblioteca


INFO: Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.
GRAVE: Exception while loading the app
org.glassfish.deployment.common.DeploymentException: java.lang.NoClassDefFoundError: org/hamcrest/Description
        at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:167)
        at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:125)
        at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:224)
        at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:338)
        at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:183)
        at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:272)
        at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:305)
        at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:320)
        at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1176)
        at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$900(CommandRunnerImpl.java:83)
        at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1235)
        at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1224)
        at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:365)
        at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:204)
        at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:166)
        at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:100)
        at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:245)
        at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
        at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
        at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
        at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
        at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
        at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
        at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
        at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
        at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
        at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
        at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
        at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
        at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
        at java.lang.Thread.run(Thread.java:619)
Caused by: com.google.common.collect.ComputationException: java.lang.NoClassDefFoundError: org/hamcrest/Description
        at com.google.common.collect.MapMaker$StrategyImpl.compute(MapMaker.java:602)
        at com.google.common.collect.MapMaker$StrategyImpl.compute(MapMaker.java:462)
        at com.google.common.collect.CustomConcurrentHashMap$ComputingImpl.get(CustomConcurrentHashMap.java:2045)
        at org.jboss.weld.resources.ClassTransformer.loadClass(ClassTransformer.java:164)
        at org.jboss.weld.bootstrap.BeanDeployer.addClass(BeanDeployer.java:61)
        at org.jboss.weld.bootstrap.BeanDeployer.addClasses(BeanDeployer.java:88)
        at org.jboss.weld.bootstrap.BeanDeployment.deployBeans(BeanDeployment.java:134)
        at org.jboss.weld.bootstrap.WeldBootstrap.deployBeans(WeldBootstrap.java:377)
        at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:165)
        ... 30 more
Caused by: java.lang.NoClassDefFoundError: org/hamcrest/Description
        at java.lang.Class.getDeclaredConstructors0(Native Method)
        at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
        at java.lang.Class.getConstructor0(Class.java:2699)
        at java.lang.Class.getDeclaredConstructor(Class.java:1985)
        at org.jboss.weld.util.reflection.SecureReflections$10.work(SecureReflections.java:239)
        at org.jboss.weld.util.reflection.SecureReflections$10.work(SecureReflections.java:235)
        at org.jboss.weld.util.reflection.SecureReflectionAccess.run(SecureReflectionAccess.java:54)
        at org.jboss.weld.util.reflection.SecureReflectionAccess.runAsMethodAccess(SecureReflectionAccess.java:119)
        at org.jboss.weld.util.reflection.SecureReflections.getDeclaredConstructor(SecureReflections.java:234)
        at org.jboss.weld.util.Proxies.isClassProxyable(Proxies.java:248)
        at org.jboss.weld.util.Proxies.isTypeProxyable(Proxies.java:201)
        at org.jboss.weld.util.Proxies.isTypesProxyable(Proxies.java:229)
        at org.jboss.weld.introspector.jlr.AbstractWeldAnnotated.<init>(AbstractWeldAnnotated.java:179)
        at org.jboss.weld.introspector.jlr.WeldClassImpl.<init>(WeldClassImpl.java:145)
        at org.jboss.weld.introspector.jlr.WeldClassImpl.of(WeldClassImpl.java:140)
        at org.jboss.weld.resources.ClassTransformer$TransformTypeToWeldClass.apply(ClassTransformer.java:50)
        at org.jboss.weld.resources.ClassTransformer$TransformTypeToWeldClass.apply(ClassTransformer.java:38)
        at com.google.common.collect.MapMaker$StrategyImpl.compute(MapMaker.java:592)
        ... 38 more
Caused by: java.lang.ClassNotFoundException: org.hamcrest.Description
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at org.glassfish.web.loader.WebappClassLoader.findClass(WebappClassLoader.java:959)
        at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1430)
        ... 56 more

vc tá com o jar do hamcrest no WEB-INF/lib?

Eu uso o netbeans e nele nao tem a pasta lib no WEB_INF
eu so adiciono o jar em bibliotecas e boa

EU Nao consigo entender fechei e abri o netbenas e funcionou.
Mais eu ja tinha feito isso umas 4 vezes

Agora quando vou inserir a imagem da o sequinte erro.

br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: java.util.MissingResourceException: Can’t find bundle for base name messages, locale pt_BR

bom, vc adicionou o jar do hamcrest que vem no zip do vraptor?

se sim esse código deveria funcionar. tenta dar um clean no projeto e no servidor e reiniciar tudo

precisa de um arquivo chamado messages.properties no classpath (estranho, não deveria precisar disso na última versão do vraptor)

vc pode criar esse arquivo na sua pasta src (ou src/main/resources)

[quote=Lucas Cavalcanti]precisa de um arquivo chamado messages.properties no classpath (estranho, não deveria precisar disso na última versão do vraptor)

vc pode criar esse arquivo na sua pasta src (ou src/main/resources)[/quote]

Desculpa a minha ignorancia mais o Vraptor foi vc quem criou?
hauahahuaa
Vc sabe tudo

eu não criei, mas sou um dos desenvolvedores :wink:

Esta entendido entao rsss.
Bom esta dando erro 405 mais eu creio que este é por causa de erros nao nas imagens

vou postar aqui meus codigos para ver se pode me ajudar.
primeiro o edita.jsp


<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<html>
	<head>
		<title>Produtos</title>
		<link href="<c:url value="/goodbuy.css"/>" rel="stylesheet" type="text/css" media="screen" />
		<link href="<c:url value="/javascripts/jquery.autocomplete.css"/>" rel="stylesheet" type="text/css" media="screen" />
		<script type="text/javascript" src="<c:url value="/javascripts/jquery-1.3.2.min.js"/>"></script>
		<script type="text/javascript" src="<c:url value="/javascripts/jquery.validate.min.js"/>"></script>
		<script type="text/javascript" src="<c:url value="/javascripts/jquery.autocomplete.min.js"/>"></script>
		<script type="text/javascript" src="<c:url value="/javascripts/jquery.puts.js"/>"></script>
		<fmt:setLocale value="pt_br"/>
    </head>
    <body>
       
         <table width="100%">
            <tr>
                <td>
                 <%@ include file="/header1.jspf" %>
                </td>
            </tr>
        </table>
           <form action="<c:url value="/admin/${produto.id }"/>" method="POST" enctype="multipart/form-data">
            <fieldset>
                <legend>Editar Produto</legend>
                    <input type="hidden" name="produto.id" value="${produto.id }" />
                    <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" cols="30" rows="10" name="produto.descricao">${produto.descricao }</textarea>
                    <label for="preco">Preço:</label>
                    <input id="preco" type="text" name="produto.preco" value="${produto.preco }"/>
                    <label for="peso">Peso:</label>
                    <input id="peso" type="text" name="produto.peso" value="${produto.peso }"/>
                    <legend>Upload de Imagem</legend>
                    <input type="file" name="imagem" />
                    <button type="submit">Enviar</button>
                    
            </fieldset>
        </form>
        <script type="text/javascript">
            $('#produtosForm').validate();
        </script>
    </body>
</html>

Agora o ProdutosController


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.caelum.goodbuy.controller;

import br.com.caelum.goodbuy.dao.ProdutoDao;
import br.com.caelum.goodbuy.modelo.Produto;
import br.com.caelum.vraptor.Delete;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Put;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.validator.ValidationMessage;
import br.com.caelum.vraptor.view.Results;
import java.util.List;

/**
 *
 * @author Fred
 */
@Resource
public class ProdutosController {
    private final ProdutoDao dao;
    private final Result result;
    private final Validator validator;
   
        public ProdutosController(ProdutoDao dao, Result result, Validator validator) {
        this.dao = dao;
        this.result = result;
        this.validator = validator;
       
       }
    @Get @Path("/produtos")
    public List<Produto> lista() {
        return dao.listaTudo();
}
    @Post @Path("/produtos")
    public void adiciona(final Produto produto) {
       if (produto.getNome() == null || produto.getNome().length() < 3) {validator.add(new ValidationMessage("Nome é obrigatório e precisa ter mais de 3 letras", "produto.nome"));
}
        if (produto.getDescricao() == null || produto.getDescricao().length() > 40) {validator.add(new ValidationMessage("Descrição é obrigatória não pode ter mais que 40 letras","produto.descricao"));
}
        if (produto.getPreco() <= 0) {validator.add(new ValidationMessage("Preço precisa ser positivo", "produto.preco"));
}
        validator.onErrorUsePageOf(ProdutosController.class).formulario();
        dao.salva(produto);
        result.redirectTo(this).lista1();
            
}


        
    @Get @Path("/admin/novo")
    public void formulario() {

        }
    @Get @Path("/admin/admin")
    public List<Produto> lista1() {
        return dao.listaTudo();
}


    @Get @Path("/admin/{id}")
    public Produto edita(Long id) {
        return dao.carrega(id);
}
    @Put @Path("/admin/{produto.id}")
    public void altera(Produto produto) {
        dao.atualiza(produto);
        result.redirectTo(this).lista1();
}
    @Delete @Path("/admin/{id}")
    public void remove(Long id) {
        Produto produto = dao.carrega(id);
        dao.remove(produto);
        result.redirectTo(this).lista1();
}
    @Get @Path("/produtos/busca")
    public List<Produto> busca(String nome) {
        result.include("nome", nome);
        return dao.busca(nome);
}
   @Get @Path("/produtos/busca.json")
        public void buscaJson(String nome) {
         result.use( Results.json()).withoutRoot()
        .from(dao.busca(nome))
        .exclude("id", "descricao")
        .serialize();
   
}
}

ProdutoDao:


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.caelum.goodbuy.dao;

import br.com.caelum.goodbuy.infra.CriadorDeSession;
import br.com.caelum.goodbuy.modelo.Produto;
import br.com.caelum.vraptor.ioc.Component;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;


/**
 *
 * @author Fred
 */
@Component
public class ProdutoDao {
   private final Session session;
    public ProdutoDao() {
    this.session = CriadorDeSession.getSession();
}
 

    
     
    
     public void salva(Produto produto) throws HibernateException {
        
        Transaction tx = session.beginTransaction();
        session.save(produto);
        tx.commit();
    }
     public void atualiza(Produto produto) {
        Transaction tx = session.beginTransaction();
        this.session.update(produto);
        tx.commit();
    }
      public void remove(Produto produto) {
        Transaction tx = session.beginTransaction();
        this.session.delete(produto);
        tx.commit();
        }
      public List<Produto> listaTudo() {
        return this.session.createCriteria(Produto.class).list();
}
      public Produto carrega(Long id) {
        return (Produto) this.session.load(Produto.class, id);
}
      public List<Produto> busca(String nome) {
    return session.createCriteria(Produto.class).add(Restrictions.ilike("nome", nome, MatchMode.ANYWHERE)).list();
}
      public void recarrega(Produto produto) {
        session.refresh(produto);
}

}

Bom quando clico em enviar ele da este erro 405

Hahaha eu coloquei PUT e nao POST ai dava errado mesmo rss

Bom mais agora nao acontece nada quando coloco a imagem e clico em enviar, ele simplesmente me rotorna a pagina sem alterar nada.
vai ai os codigos
Classe imagens:

 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.caelum.goodbuy.imagens;

import br.com.caelum.goodbuy.modelo.Produto;
import br.com.caelum.vraptor.interceptor.multipart.UploadedFile;
import br.com.caelum.vraptor.ioc.Component;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.servlet.ServletContext;
import org.apache.commons.io.IOUtils;



/**
 *
 * @author Fred
 */
@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.copyLarge(imagem.getFile(), new FileOutputStream(destino));
            }catch (IOException e) {
                throw new RuntimeException("Erro ao copiar imagem", e);
            }
        }
        public File mostra(Produto produto) {
            return new File(pastaImagens, produto.getId() + ".imagem");
        }

}

ImagensCOntroller

package br.com.caelum.goodbuy.controller;

import java.io.File;
import br.com.caelum.vraptor.Get;
import br.com.caelum.goodbuy.imagens.Imagens;
import br.com.caelum.goodbuy.modelo.Produto;
import br.com.caelum.vraptor.Path;
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;
import br.com.caelum.vraptor.validator.Validations;
import static org.hamcrest.Matchers.*;  




/**
 *
 * @author Fred
 */
@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 @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());


}
    @Get @Path("/admin/{produto.id}/imagem")
        public File download(Produto produto) {
        return imagens.mostra(produto);
}
}

o edita.jsp

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<html>
	<head>
		<title>Produtos</title>
		<link href="<c:url value="/goodbuy.css"/>" rel="stylesheet" type="text/css" media="screen" />
		<link href="<c:url value="/javascripts/jquery.autocomplete.css"/>" rel="stylesheet" type="text/css" media="screen" />
		<script type="text/javascript" src="<c:url value="/javascripts/jquery-1.3.2.min.js"/>"></script>
		<script type="text/javascript" src="<c:url value="/javascripts/jquery.validate.min.js"/>"></script>
		<script type="text/javascript" src="<c:url value="/javascripts/jquery.autocomplete.min.js"/>"></script>
		<script type="text/javascript" src="<c:url value="/javascripts/jquery.puts.js"/>"></script>
		<fmt:setLocale value="pt_br"/>
    </head>
    <body>
       
         <table width="100%">
            <tr>
                <td>
                 <%@ include file="/header1.jspf" %>
                </td>
            </tr>
        </table>
           <form action="<c:url value="/admin/${produto.id }/imagem"/>" method="POST" enctype="multipart/form-data">
            <fieldset>
                <legend>Editar Produto</legend>
                    <input type="hidden" name="produto.id" value="${produto.id }" />
                    <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" cols="30" rows="10" name="produto.descricao">${produto.descricao }</textarea>
                    <label for="preco">Preço:</label>
                    <input id="preco" type="text" name="produto.preco" value="${produto.preco }"/>
                    <label for="peso">Peso:</label>
                    <input id="peso" type="text" name="produto.peso" value="${produto.peso }"/>
                    <legend>Upload de Imagem</legend>
                    <input type="file" name="imagem" />
                    <button type="submit">Enviar</button>
                    
            </fieldset>
        </form>
        <script type="text/javascript">
            $('#produtosForm').validate();
        </script>
    </body>
</html>

Opa amigo, já passei por isso antes. (vou lhe falar uma coisa, mas nao tenho certeza), separa o upload da imagem do cadastro do produto. pois já fiz esse exercício da FJ28 e tive problemas com isso. o envio da imagem nao da certo com o cadastro. segundo um professor meu é por causa do protocolo HTTP. Na época que me ajudou fou o Lucas tb. o post é esse ai…http://www.guj.com.br/java/218906-upload-de-imagens-com-vraptor da uma olhada… qlqr coisa posta suas dúvidas novamente… vlw

[quote=well]Opa amigo, já passei por isso antes. (vou lhe falar uma coisa, mas nao tenho certeza), separa o upload da imagem do cadastro do produto. pois já fiz esse exercício da FJ28 e tive problemas com isso. o envio da imagem nao da certo com o cadastro. segundo um professor meu é por causa do protocolo HTTP. Na época que me ajudou fou o Lucas tb. o post é esse ai…http://www.guj.com.br/java/218906-upload-de-imagens-com-vraptor da uma olhada… qlqr coisa posta suas dúvidas novamente… vlw [/quote
well Eu sou muito cru com isso, vc tem ai uma dica ou tutorial para me ajudar?
vi no seu topico que vc fez ao adicionar o produto ele chama uma tela para por a imagem correto?
como fez isso?

Cara, fiz algo do tipo sim. mas agora de cabeça, baboo… vou lhe mandar um quebra galho…

@Post @Path("/produtos")
	public void adiciona(Produto produto) {

		dao.adiciona(produto);
		result.redirectTo(ProdutosController.class).lista();
	}

assim ele vai te redirecionar para o metodo lista certo…
ai vc define uma imagem default, do tipo NO IMAGEM,
e cria um link para alterar a imagem tipo isso.

<label for ="imagem">Imagem:</label>
	<a href="<c:url value="/produtos/${produto.id}/editaFoto" />"><img  alt="Alterar Imagem" title="Alterar Imagem" src="<c:url value="/bcis/${bci.inscricaoCadastral }/imagem"/>" width="20px" height="20px"></img></a><br />	
	
	<button type="submit" name="_method" value="PUT">Alterar</button>

ai blz, vai alterar a foto daquele produto…

ai no imagens controller vc redireciona para onde desejar…

[code]@Post
@Path("/produtos/{produto.id}/imagem")
public void upload(Produto produto, final UploadedFile imagem) throws IOException{

	imagens.upload(imagem, produto);
	result.redirectTo(ProdutosController.class).lista();
}[/code]

no meu caso eu redirecionei para lista novamente. mas vc pode redirecionar para adicionar um novo produto… tipo:

result.redirectTo(ProdutosController.class).adiciona();

nao é o mais usual para o cliente, mas na pressa… já ajuda… :slight_smile:

é pra um projeto da facu ja serve sim.
amanha bem cedo eu tento, estou a 2 dias sem dormir heeheh nao ta funcionando mais o cerebro
Obrigado cara

tentei e nao conseguir rsssss

Bom vamos la heheehe e segue a jornada rsss.
Bom seguindo os passos do Well no listar eu coloquei um link para alterar a foto:

 <td><label for ="imagem">Imagem:</label>
	<a href="<c:url value="/admin/${produto.id}/editafoto" />"><img  alt="Alterar Imagem" title="Alterar Imagem" src="<c:url value="/bcis/${bci.inscricaoCadastral }/imagem"/>" width="20px" height="20px"></img></a><br /></td>

Dentro da pasta produtos eu criei um formulario chamado edita foto.

No ProdutosController eu fiz assim:

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

        }

Era pra trazer o formulario nao?
ele da erro 404!