Segui os passos demonstrados no vídeo, mas quanto faço a chamada para carrinho dentro CarrinhoComprasControler, recebo o erro abaixo:
javax.el.PropertyNotFoundException: Property 'produto' not found on type java.lang.String
Minhas classes:
package br.com.casadocodigo.loja.controllers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.ModelAndView;
import br.com.casadocodigo.loja.dao.ProdutoDAO;
import br.com.casadocodigo.loja.models.CarrinhoCompras;
import br.com.casadocodigo.loja.models.CarrinhoItem;
import br.com.casadocodigo.loja.models.Produto;
import br.com.casadocodigo.loja.models.TipoPreco;
@Controller
@RequestMapping("/carrinho")
@Scope(value=WebApplicationContext.SCOPE_REQUEST)
public class CarrinhoComprasController {
@Autowired
private ProdutoDAO produtoDao;
@Autowired
private CarrinhoCompras carrinho;
@RequestMapping("/add")
public ModelAndView add(Integer produtoId, TipoPreco tipoPreco){
ModelAndView modelAndView = new ModelAndView("redirect:/carrinho");
CarrinhoItem carrinhoItem = criaItem(produtoId, tipoPreco);
carrinho.add(carrinhoItem);
return modelAndView;
}
private CarrinhoItem criaItem(Integer produtoId, TipoPreco tipoPreco){
Produto produto = produtoDao.find(produtoId);
CarrinhoItem carrinhoItem = new CarrinhoItem(produto, tipoPreco);
return carrinhoItem;
}
@RequestMapping(method=RequestMethod.GET)
public ModelAndView itens(){
return new ModelAndView("carrinho/itens");
}
}
package br.com.casadocodigo.loja.models;
import java.math.BigDecimal;
public class CarrinhoItem {
private Produto produto;
private TipoPreco tipoPreco;
public CarrinhoItem(Produto produto, TipoPreco tipoPreco) {
this.produto = produto;
this.tipoPreco = tipoPreco;
}
public Produto getProduto() {
return produto;
}
public void setProduto(Produto produto) {
this.produto = produto;
}
public TipoPreco getTipoPreco() {
return tipoPreco;
}
public void setTipoPreco(TipoPreco tipoPreco) {
this.tipoPreco = tipoPreco;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((produto == null) ? 0 : produto.hashCode());
result = prime * result
+ ((tipoPreco == null) ? 0 : tipoPreco.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
CarrinhoItem other = (CarrinhoItem) obj;
if (produto == null) {
if (other.produto != null)
return false;
} else if (!produto.equals(other.produto))
return false;
if (tipoPreco != other.tipoPreco)
return false;
return true;
}
public BigDecimal getPreco(){
return produto.precoPara(tipoPreco);
}
public BigDecimal getTotal(int quantidade) {
return this.getPreco().multiply(new BigDecimal(quantidade));
}
}
package br.com.casadocodigo.loja.models;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.List;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import org.springframework.format.annotation.DateTimeFormat;
@Entity
public class Produto {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String titulo;
private String descricao;
private int paginas;
private String sumarioPath;
@ElementCollection
private List<Preco> precos;
@DateTimeFormat(pattern="dd/MM/yyyy")
private Calendar dataLancamento;
public Calendar getDataLancamento() {
return dataLancamento;
}
public void setDataLancamento(Calendar dataLancamento) {
this.dataLancamento = dataLancamento;
}
public List<Preco> getPrecos() {
return precos;
}
public void setPrecos(List<Preco> precos) {
this.precos = precos;
}
@Override
public String toString() {
return "Produto [titulo=" + titulo + ", descricao=" + descricao
+ ", paginas=" + paginas + "]";
}
public String getTitulo() {
return titulo;
}
public void setTitulo(String titulo) {
this.titulo = titulo;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public int getPaginas() {
return paginas;
}
public void setPaginas(int paginas) {
this.paginas = paginas;
}
public String getSumarioPath() {
return sumarioPath;
}
public void setSumarioPath(String sumarioPath) {
this.sumarioPath = sumarioPath;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Produto other = (Produto) obj;
if (id != other.id)
return false;
return true;
}
public BigDecimal precoPara(TipoPreco tipoPreco) {
for (Preco preco : precos) {
if(preco.getTipo().equals(tipoPreco)){
return preco.getValor();
}
}
return null;
}
}
E o trecho dentro da JSP:
<c:forEach items="{carrinhoCompras.itens}" var="item">
<tr>
<td class="cart-img-col"><img
src="http://cdn.shopify.com/s/files/1/0155/7645/products/css-eficiente-featured_large.png?v=1435245145"
width="71px" height="100px" /></td>
<td class="item-title">${item.produto.titulo }</td>