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

HTTP Status 500 após fazer a compra do produto e ser redirecionado à casadocodigo/carinho

Quando clico para comprar um produto, primeiramente o comando é bem sucedido e adicionado à lista de compras, porém ao ser redirecionado para página: "itens.jsp", ocorre o status 500:

Message javax.el.PropertyNotFoundException: Property [produto] not found on type [java.lang.String]

Description The server encountered an unexpected condition that prevented it from fulfilling the request.
package br.com.casadocodigo.loja.controllers;

@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) {
        System.out.println("Entrou aqui no carrinho/add");
        ModelAndView modelAndView = new ModelAndView("redirect:/carrinho");
        CarrinhoItem carrinhoItem = criaItem(produtoId, tipoPreco);

        carrinho.add(carrinhoItem);

        return modelAndView;
    }

    @RequestMapping(method=RequestMethod.GET)
    public ModelAndView itens() {
        System.out.println("Acabou de pessar pelo reqmap do itens");
        return new ModelAndView("carrinho/itens");
    }

    private CarrinhoItem criaItem(Integer produtoId, TipoPreco tipoPreco) {
        Produto produto = produtoDAO.find(produtoId);
        CarrinhoItem carrinhoItem = new CarrinhoItem(produto, tipoPreco);
        return carrinhoItem;
    }

}
package br.com.casadocodigo.loja.models;

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

    private static final long serialVersionUID = 1L;

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

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

    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 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.values().stream().reduce(0, (proximo, acumulador) -> proximo + acumulador);
    }
}
package br.com.casadocodigo.loja.models;

import java.math.BigDecimal;

public class CarrinhoItem {

    private Produto produto;
    private 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;
    }

    public CarrinhoItem(Produto produto, TipoPreco tipoPreco) {
        this.produto = produto;
        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));
    }

}

Gostaria de ajuda.

3 respostas
solução!

Boa noite, Felipe! Como vai?

O problema está no seu arquivo itens.jsp, pois vc está utilizando uma propriedade chamada "produto" que não está sendo encontrada.

Caso vc ainda esteja com o problema, poste o conteúdo do arquivo itens.jsp que eu te ajudo!

Grande abraço!

Boa noite, Gabriel. Muito obrigado pela sua atenção. Era exatamente isto mesmo. Como vc sabia q se tratava do itens.jsp?

Elementar, meu caro aluno! Vc disse na descrição do seu problema que o erro acontecia ao ser redirecionado para essa página. E a primeira linha da mensagem de erro que vc postou denuncia o problema!

Grande abraço e bons estudos!

Sherlock Holmes