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