Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Erro 500 ao clicar em comprar

Ao clicar em comprar, é apresentado o erro 500

Log de erros:

https://gist.github.com/anonymous/d4c689d38f1b40bb8ceaa83fc56af2e6

itens.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>




<body>
  <section class="container middle">

  <h2 id="cart-title">Seu carrinho de compras</h2>

    <table id="cart-table">
      <colgroup>
        <col class="item-col">
        <col class="item-price-col">
        <col class="item-quantity-col">
        <col class="line-price-col">
        <col class="delete-col">
      </colgroup>
      <thead>
        <tr>
          <th class="cart-img-col"></th>
          <th width="65%">Item</th>
          <th width="10%">Preço</th>
          <th width="10%">Quantidade</th>
          <th width="10%">Total</th>
          <th width="5%"></th>
        </tr>
      </thead>
      <tbody>
        <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="numeric-cell">${item.preco}</td>
        <td class="quantity-input-cell">
            <input type="number" min="0" readonly="readonly" id="updates_4082273665" name="updates[4082273665]" value="1" />
        </td>
        <td class="numeric-cell">${carrinhoCompras.getTotal(item)}</td>
        <td>
            <form action="" method="post">
                    <input type="image" src="/excluir.png" alt="Excluir" title="Excluir" />
            </form>
        </td>
    </tr>
</c:forEach>

      </tbody>
      <tfoot>
        <tr>
          <td colspan="4">
              <form:form action="${s:mvcUrl('PC#finalizar').build() }" method="post">
                  <input type="submit" class="checkout" name="checkout" 
                      value="Finalizar compra " id="checkout"/>
              </form:form>
          </td>
          <td class="numeric-cell">${carrinhoCompras.total }</td>
          <td></td>
        </tr>
      </tfoot>
    </table>

  <h2>Voçê já conhece os outros livros da Casa do Código?</h2>
  <ul id="collection" class="related-books">
    <li class="col-left">
      <a href="/products/livro-ferramentas-devops" class="block clearfix book-suggest" data-book="Caixa de Ferramentas DevOps: Um guia para construção, administração e arquitetura de sistemas modernos">
        <img width="113px" height="160px" src="//cdn.shopify.com/s/files/1/0155/7645/products/oy0mvtYotVNh0eUSt2CAC3Kf7j_qtMIxtd31jNUYP08_size_1024x768_size_mode_2_compact.jpeg?v=1438176025" alt="Caixa de Ferramentas DevOps: Um guia para construção, administração e arquitetura de sistemas modernos">
      </a>
    </li>
    <li class="col-right">
      <a href="/products/livro-css-eficiente" class="block clearfix book-suggest" data-book="CSS Eficiente: Técnicas e ferramentas que fazem a diferença nos seus estilos">
        <img width="113px" height="160px" src="//cdn.shopify.com/s/files/1/0155/7645/products/css-eficiente-featured_compact.png?v=1435245145" alt="CSS Eficiente: Técnicas e ferramentas que fazem a diferença nos seus estilos">
      </a>
    </li>
    <li class="col-left">
      <a href="/products/livro-banco-mysql" class="block clearfix book-suggest" data-book="MySQL: Comece com o principal banco de dados open source do mercado">
        <img width="113px" height="160px" src="//cdn.shopify.com/s/files/1/0155/7645/products/bancomysql-featured_compact.png?v=1437417574" alt="MySQL: Comece com o principal banco de dados open source do mercado">
      </a>
    </li>
    <li class="col-left">
      <a href="/products/livro-xp-extreme-programming" class="block clearfix book-suggest" data-book="eXtreme Programming: Práticas para o dia a dia no desenvolvimento ágil de software">
        <img width="113px" height="160px" src="//cdn.shopify.com/s/files/1/0155/7645/products/MWv_cGrvQEiSB16qd6Qrr7_29jPyP0tUVVlSsQ2kAIQ_size_1024x768_size_mode_2_compact.jpeg?v=1438803579" alt="eXtreme Programming: Práticas para o dia a dia no desenvolvimento ágil de software">
      </a>
    </li>
  </ul>

  <h2><a href="${s:mvcUrl('HC#index').build() }">Veja todos os livros que publicamos!</a></h2>

  </section>

</body>

Alguém poderia me ajudar ?

4 respostas

Fala Lucas, tudo bem ?

A exception diz que não há valor presente ao tentar ler a propriedade preço ${item.preco} do item de compra. Como está o código da classe que define o item de compra, poste aqui pra ter uma ideia do porque ela não devolve valor a partir do getPreco que deve existir internamente...

Essa é a classe CarrinhoItem:

package br.com.casadocodigo.loja.models;

import java.io.Serializable;
import java.math.BigDecimal;

public class CarrinhoItem implements Serializable {

    private static final long serialVersionUID = 1L;

    private Produto produto;
    private TipoPreco tipoPreco;

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

    public BigDecimal getPreco(){
        return produto.precoPara(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 getTotal(int quantidade) {
        return this.getPreco().multiply(new BigDecimal(quantidade));
    }

}

CarrinhoCompras:

package br.com.casadocodigo.loja.models;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;

import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.stereotype.Component;
import org.springframework.web.context.WebApplicationContext;

@Component
@Scope(value=WebApplicationContext.SCOPE_SESSION)
public class CarrinhoCompras implements Serializable {

    private static final long serialVersionUID = 1L;

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

     public Collection<CarrinhoItem> getItens() {
        return itens.keySet();
    }

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

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

    public int getQuantidade() {
        return itens.size();
    }

    public BigDecimal getTotal(CarrinhoItem item) {
        return item.getTotal(getQuantidade(item));
    }

    public BigDecimal getTotal() {
        BigDecimal total = BigDecimal.ZERO;
        for (CarrinhoItem item : itens.keySet()) {
            total = total.add(getTotal(item));
        }
        return total;
    }

    public void remover(Integer produtoId, TipoPreco tipoPreco) {
        Produto produto = new Produto();
        produto.setId(produtoId);
        itens.remove(new CarrinhoItem(produto, tipoPreco));
    }

}

Alguém tem alguma ideia ?

solução!

Fala Lucas, tudo bem ?

Pelos códigos não parece ter nada errado, fica difícil saber porque não está tendo preço quando chega na página.

O getPreço chama o método precoPara do produto, que, imagino, deve estar assim:

public BigDecimal precoPara(TipoLivro tipoLivro) {
    return this.precos.stream()
        .filter(preco -> preco.getTipoLivro().equals(tipoLivro))
        .findFirst().get()
        .getValor();
}

Confere?

Verique se o(s) produto(s) selecionado(s) tem realmente preço definido.

Se for possível, compartilhe seu código por algum repositório aberto de código, como o github.

Abraço!