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

HTTP Status 500 - An exception occurred processing JSP page /WEB-INF/views/carrinho/itens.jsp

olá pessoal, estou recebendo esse erro:

set 17, 2017 5:08:49 PM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [dispatcher] in context with path [/casadocodigo] threw exception [An exception occurred processing JSP page /WEB-INF/views/carrinho/itens.jsp at line 111

108:                             <img src="http://cdn.shopify.com/s/files/1/0155/7645/products/css-eficiente-featured_large.png?v=1435245145" width="71px" height="100px" />
109:                         </td>
110:                         <td class="item-title">${item.produto.titulo}</td>
111:                         <td class="numeric-cell">${item.preco}</td>
112:                         <td class="quantity-input-cell">
113:                             <input type="number" min="0" readonly="readonly" id="quantidade" name="quantidade" value="${carrinhoCompras.getQuantidade(item) }" />
114:                         </td>


Stacktrace:] with root cause
java.util.NoSuchElementException: No value present
    at java.util.Optional.get(Unknown Source)
    at br.com.casadocodigo.loja.models.Produto.precoPara(Produto.java:107)
    at br.com.casadocodigo.loja.models.CarrinhoItem.getPreco(CarrinhoItem.java:60)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at javax.el.BeanELResolver.getValue(BeanELResolver.java:99)
    at org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:104)
    at org.apache.el.parser.AstValue.getValue(AstValue.java:184)

Notei o erro a partir da aula 14 ao ter criado a classe PagamentoController e inserido o método finalizar, na sequência, foi necessário o proxyMode=ScopedProxyMode.TARGET_CLASS na classe CarrinhoCompras Segue minha classe 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, proxyMode=ScopedProxyMode.TARGET_CLASS)
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);
    }

    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);
    }

    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));

    }

}

E meu jsp itens: https://gist.github.com/anonymous/0174cfff3ba921671c5055d5508455a3

O erro ocorre bem nesta linha

<td class="numeric-cell">${item.preco}</td>

Notei que meu construtor do CarrinhoItem recebe corretamente o Produto porem o TipoPreco vem NULL https://gist.github.com/anonymous/ecbb3f3d121fe64e02c38f02a6b3cd19

3 respostas

Como o CarrinhoItem está sendo montado? Pelo DAO? Está usando Hibernate? Pode compartilhar esse código?

Uma solução temporária é criar um construtor que recebe uma String tipoPreco e você converter no enum na hora:

public CarrinhoItem (Produto p, String tp) {
  this.produto = p;
  this.tipoPreco = TipoPreco.valueOf(tp);
}
solução!

Seu getQuantidade esta como privado, tente trocar para public

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

No meu caso a resposta acima resolveu!! Obrigada Slinkey!!