Fala ae pessoal, foi mal por reabrir o toópico, mas o meu problema está sendo exatamente o mesmo, mas com o VRaptor4, então acho que não preciso dos jars do Pico, Guice ou Spring, certo?
Segue minha classe Controller.
package br.com.caelum.goodbuy.controller;
import javax.inject.Inject;
import br.com.caelum.goodbuy.dao.ProdutoDao;
import br.com.caelum.goodbuy.modelo.Carrinho;
import br.com.caelum.goodbuy.modelo.Item;
import br.com.caelum.vraptor.Controller;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Result;
@Controller
public class CarrinhoController {
@Inject private ProdutoDao produtoDao;
@Inject private Result result;
@Inject private Carrinho carrinho;
@Post @Path("/carrinho")
public void adiciona(Item item ) {
try {
System.out.println(" --");
System.out.println(" ===> ACESSANDO CarrinhoController.adiciona()");
item.setProduto(produtoDao.buscarPorId(item.getProduto().getId()));
carrinho.adicionaItem(item);
result.redirectTo(ProdutosController.class).lista();
}
catch(Exception e) {
System.out.println(" --");
System.out.println(" ==> ERRO :: " + e.toString());
}
}
@Get @Path("/carrinho")
public void visualiza() {
// apenas para acessar a página de visualização do Carrinho de Compras
System.out.println(" --");
System.out.println(" ===> ACESSANDO CarrinhoController.visualiza()");
}
}
Segue minha classe Carrinho
package br.com.caelum.goodbuy.modelo;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.context.SessionScoped;
@SessionScoped
public class Carrinho implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private List<Item> itens = new ArrayList<Item>();
private Double total = 0.0;
public List<Item> getItens() {
return itens;
}
public void setItens(List<Item> itens) {
this.itens = itens;
}
public Double geotal() {
return total;
}
public void setTotal(Double total) {
this.total = total;
}
public void adicionaItem(Item item) {
itens.add(item);
total += item.getProduto().getPreco() * item.getQuantidade();
}
public Integer getTotalDeItens() {
return itens.size();
}
}
Esse é o header.jsp
<div id="header">
<div id="carrinho">
<h3><a href="<c:url value="/carrinho"/>">Meu carrinho:</a></h3>
<h3><a href="<c:url value="/carrinho/index"/>">INDEX</a></h3>
${carrinho }
</div>
</div>
E esse é o visualiza.jsp
<h3>Itens do seu carrinho de compras</h3>
<c:if test="${empty carrinho or carrinho.totalDeItens eq 0 }">
<span>Você não possui itens no seu carrinho</span>
</c:if>
<c:if test="${carrinho.totalDeItens > 0 }">
<table>
<thead>
<tr>
<th>Nome</th>
<th>Descrição</th>
<th>Preço</th>
<th>Qtde</th>
<th>Total</th>
</tr>
</thead>
<tbody>
<c:forEach items="${carrinho.itens}" var="item">
<tr>
<td>${item.produto.nome }</td>
<td>${item.produto.descricao }</td>
<td>
<fmt:formatNumber type="currency"
value="${item.produto.preco }"/>
</td>
<td>${item.quantidade }</td>
<td>
<fmt:formatNumber type="currency"
value="${item.quantidade * item.produto.preco }"/>
</td>
</tr>
</c:forEach>
</tbody>
<tfoot>
<tr>
<td colspan="2"></td>
<th colspan="2">Total:</th>
<th>
<fmt:formatNumber type="currency"
value="${carrinho.total }"/>
</th>
</tr>
</tfoot>
</table>
</c:if>
Quando instancio o Tomcat7 no modo Debug, acesso o método CarrinhoController.adiciona() vejo que o Carrinho injetado está com a lista de itens vazia e o valor total 0.0. Mas se continuo o Debug e entro no método Carrinho.adicionaItem() ae vejo o Carrinho com lista de itens preenchido e o valor total calculado certo. É como se o Controller não estivesse conseguindo “persistir” as informações dos atributos da classe injetada, mesmo sendo uma SessionScoped.
O que preciso fazer ainda?
Abraço.