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

Finalizar Carrinho e Sumir Itens como fazer?

Olá amigos, não sei de o de vocês finalizam o carrinho após a compra, o meu mostra que esta tudo "finalizando compra realizada com sucesso". Porem se eu for no carrinho os itens ainda estão la, gostaria de apos finalizar a compra, zerar os produtos do carrinho.

PagamentoController

@RequestMapping("/pagamento")
@Controller
public class PagamentoController {

    @Autowired
    CarrinhoCompras carrinho;

    @Autowired
    RestTemplate restTemplate;

    @RequestMapping(value="/finalizar", method = RequestMethod.POST)
    public Callable<ModelAndView> finalizar(RedirectAttributes model) {

        return () -> {

            String uri = "http://book-payment.herokuapp.com/payment";

            try {
                String response = restTemplate.postForObject(uri, new DadosPagamento(carrinho.getTotal()),
                        String.class);
                model.addFlashAttribute("sucesso", response);
                System.out.println(response);
                return new ModelAndView("redirect:/produtos");

            } catch (HttpClientErrorException e) {
                e.printStackTrace();
                model.addFlashAttribute("falha", "Valor maior que o permitido");
                return new ModelAndView("redirect:/produtos");
            }
        };
    }
}
2 respostas
solução!

Olá, tudo bem ?

Você precisa limpar o carrinho no final da compra.

Pegar seus itens, ou seja sua lista e ai limpa-la, você pode usar o método clear para fazer isso.

Olá Matheus vlw pela dica ;)

Usei o clear() e resolveu. Abaixo coloco o codigo caso alguem venha precisar no futuro.

CarrinhoCompras.java

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 {

    // Todo componente do spring que possui escopo de sessão precisa implementar
    // a interface Serializable.
    private static final long serialVersionUID = 1L;

    public void remover(Integer produtoId, TipoPreco tipoPreco) {
        Produto produto = new Produto();
        produto.setId(produtoId);
        System.out.println("Item REMOVIDO");
        itens.remove(new CarrinhoItem(produto, tipoPreco));
    }

    public void limpaCarrinho(){
        itens.clear();
    }

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

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

    // Stream e Reduce é uma expressão Lambda.
    public int getQuantidade() {
        return itens.values().stream().reduce(0, (proximo, acumulador) -> (proximo + acumulador));
    }

    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;

    }

}

E no Botão do Finaliza Invoquei o metodo.

PagamentoController.java

package br.com.casadocodigo.loja.controllers;

import java.util.concurrent.Callable;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import br.com.casadocodigo.loja.models.CarrinhoCompras;
import br.com.casadocodigo.loja.models.DadosPagamento;

@RequestMapping("/pagamento")
@Controller
public class PagamentoController {

    @Autowired
    CarrinhoCompras carrinho;

    @Autowired
    RestTemplate restTemplate;

    // CALLABLE AJUSTA A FINALIZAÇÃO DO CARRINHO E DE FORMA QUE O SISTEMA NÃO
    // PARE E OS OUTROS USUARIO CONTINUE USANDO O MESMO SEM ATRAPALHAR A OPERAÇÃO.

    @RequestMapping(value="/finalizar", method = RequestMethod.POST)
    public Callable<ModelAndView> finalizar(RedirectAttributes model) {

        // RECURSO DO JAVA 8 (LAMBDA)
        // Esta forma de usar lambda nos permite criar um objeto do mesmo tipo
        // esperado pelo retorno do método, evitando que criemos uma classe
        // anônima. Neste caso é perfeitamente aplicável o recurso, por que na
        // interface Callable só há um método, de nome call.
        return () -> {

            String uri = "http://book-payment.herokuapp.com/payment";

            try {
                String response = restTemplate.postForObject(uri, new DadosPagamento(carrinho.getTotal()),
                        String.class);
                model.addFlashAttribute("sucesso", response);
                System.out.println(response);
                carrinho.limpaCarrinho();
                System.out.println("Carrinho de Compras LIMPO");
                return new ModelAndView("redirect:/produtos");

            } catch (HttpClientErrorException e) {
                e.printStackTrace();
                model.addFlashAttribute("falha", "Valor maior que o permitido");
                return new ModelAndView("redirect:/produtos");
            }
        };
    }
}