Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Dúvida na Aula 11 Spring MVC I, não estou conseguindo adicionar produtos ao carrinho

Ao clicar em comprar recebo o erro :

type Status report

message /casadocodigo/carrinho/add

description The requested resource is not available.

Segue o código: JSP:

      <section class="buy-options clearfix">  
      <form action='<c:url value="/carrinho/add" />' method="post" class="container">
        <ul id="variants" class="clearfix">
        <input type="hidden" value="${produto.id} name="produtoId"/>
        <c:forEach items="${produto.precos}" var="preco">
              <li class="buy-option">
                <input type="radio" name="tipo" class="variant-radio" id="tipo" value="${preco.tipo }"  checked="checked"  />
                <label  class="variant-label">
                  ${preco.tipo}
                </label>
                <small class="compare-at-price">R$ 39,90</small>
                <p class="variant-price"> ${preco.valor }</p>
              </li>
              </c:forEach>           
        </ul>
        <button type="submit" class="submit-image icon-basket-alt" alt="Compre Agora" title="Compre Agora">Comprar</button>

      </form>

    </section>

Controller:

@Controller
@RequestMapping("/carrinho")
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:/produtos");
        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;
    }

}

CarrinhoCompras:

@Component
public class CarrinhoCompras {

    private Map<CarrinhoItem, Integer> itens = new LinkedHashMap<>();

    public void add(CarrinhoItem item) {
        itens.put(item, getQuantidade(item) + 1);
    }

    private int getQuantidade(CarrinhoItem item) {
        if(!itens.containsKey(item)) {
            itens.put(item, 0);
        }
        return itens.get(item);
    }

    public int getQuantidade() {
        return itens.values().stream().reduce(0, (proximo, acumulador) -> proximo + acumulador);
    }

}

CarrinhoItem:

package br.com.casadocodigo.loja.model;

public class CarrinhoItem {

    private Produto produto;
    private TipoPreco tipo;

    public CarrinhoItem(Produto produto, TipoPreco tipo) {
        this.produto = produto;
        this.tipo = tipo;
    }

    public Produto getProduto() {
        return produto;
    }
    public void setProduto(Produto produto) {
        this.produto = produto;
    }
    public TipoPreco getTipo() {
        return tipo;
    }
    public void setTipo(TipoPreco tipo) {
        this.tipo = tipo;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((produto == null) ? 0 : produto.hashCode());
        result = prime * result + ((tipo == null) ? 0 : tipo.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 (tipo != other.tipo)
            return false;
        return true;
    }
}

Também sobrescrevi o hashCode para id de Produto.

1 resposta
solução!

Consegui resolver, a classe controladora estava no pacote errado.