Senhores
Estou com um problema chato durante os estudos da apostila fj28 (Desenvolvimento Ágil para a Web 2.0 com VRaptor, Hibernate e AJAX)
No capitulo do carrinho de compras, estou com um problema no session.refresh(produto); (do recarrega) o qual não me retorna os itens do produto
executo um “System.out.println” dos gets do objeto e me é retornado null em todos, exceto no id, que já vem do form.
Sendo assim, entendo que eu esteja fazendo algo errado em alguma classe: ou na Item - que contém a propriedade produto (Produto) ou na propria produto.
Versões:
vraptor-3.4.0 (spring 3.0.5)
hibernate3
Desde já agradeço
Quem puder me ajudar a continuar os estudos, segue os fontes:
Produto
package br.com.caelum.goodbuy.modelo;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import org.hibernate.validator.Length;
import org.hibernate.validator.Min;
import org.hibernate.validator.NotNull;
@Entity
public class Produto {
@Id @GeneratedValue
private Long id;
@NotNull
@Length(min=3)
private String nome;
@NotNull
@Length(min=3)
private String descricao;
@Min(0)
private Double preco;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public Double getPreco() {
return preco;
}
public void setPreco(Double preco) {
this.preco = preco;
}
}
ProdutoDAO:
package br.com.caelum.goodbuy.dao;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import br.com.caelum.goodbuy.modelo.Produto;
import br.com.caelum.vraptor.ioc.Component;
@Component
public class ProdutoDAO
{
private final Session session;
public ProdutoDAO(Session session)
{
this.session = session;
}
@SuppressWarnings("unchecked")
public List<Produto> listaTudo()
{
return this.session.createCriteria(Produto.class).list();
}
public void grava(Produto produto)
{
Transaction tx = session.beginTransaction();
session.save(produto);
tx.commit();
}
public void atualiza(Produto produto)
{
this.session.flush();
this.session.clear();
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 Produto carrega(Long id)
{
return (Produto)this.session.load(Produto.class, id);
}
public void recarrega(Produto prod)
{
System.out.println("ID qu vem do form: " + prod.getId());
session.refresh(prod);
//Retornam todos null
System.out.println("Nome: " + prod.getNome());
System.out.println("Desc: " + prod.getDescricao());
System.out.println("Preco: " + prod.getPreco());
}
}
ProdutoController
package br.com.caelum.goodbuy.controller;
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.Delete;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
@Resource
public class CarrinhoController {
private final Carrinho carrinho;
private final ProdutoDAO dao;
private final Result result;
public CarrinhoController(Carrinho carrinho, ProdutoDAO dao, Result result){
this.carrinho = carrinho;
this.dao = dao;
this.result = result;
}
@Post @Path("/carrinho")
public void adiciona(Item item){
dao.recarrega(item.getProduto());
carrinho.adiciona(item);
result.redirectTo(CarrinhoController.class).visualiza();
}
@Get @Path("/carrinho")
public void visualiza(){
}
@Delete @Path("/carrinho/{indiceItem}")
public void remove(int indiceItem){
carrinho.remove(indiceItem);
result.redirectTo(CarrinhoController.class).visualiza();
}
}
Carrinho
/package br.com.caelum.goodbuy.modelo;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.SessionScoped;
import java.util.ArrayList;
import java.util.List;
@Component @SessionScoped
public class Carrinho {
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 getTotal() {
return total;
}
public void setTotal(Double total) {
this.total = total;
}
public void adiciona(Item item) {
itens.add(item);
//Aqui ocorre o null exception
total += item.getProduto().getPreco() * item.getQuantidade();
}
public Integer getTotalDeItens(){
return itens.size();
}
public void remove(int indiceItem) {
Item removido = itens.remove(indiceItem);
total -= removido.getQuantidade() * removido.getProduto().getPreco();
}
}
Item
package br.com.caelum.goodbuy.modelo;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.SessionScoped;
@Component @SessionScoped
public class Item
{
private Produto produto;
private Integer quantidade;
public Produto getProduto() {
return produto;
}
public void setProduto(Produto produto) {
this.produto = produto;
}
public Integer getQuantidade() {
return quantidade;
}
public void setQuantidade(Integer quantidade) {
this.quantidade = quantidade;
}
}
CarrinhoController
package br.com.caelum.goodbuy.controller;
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.Delete;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
@Resource
public class CarrinhoController {
private final Carrinho carrinho;
private final ProdutoDAO dao;
private final Result result;
public CarrinhoController(Carrinho carrinho, ProdutoDAO dao, Result result){
this.carrinho = carrinho;
this.dao = dao;
this.result = result;
}
@Post @Path("/carrinho")
public void adiciona(Item item){
dao.recarrega(item.getProduto());
carrinho.adiciona(item);
result.redirectTo(CarrinhoController.class).visualiza();
}
@Get @Path("/carrinho")
public void visualiza(){
}
@Delete @Path("/carrinho/{indiceItem}")
public void remove(int indiceItem){
carrinho.remove(indiceItem);
result.redirectTo(CarrinhoController.class).visualiza();
}
}