Array inserindo duas vezes

3 respostas
jsf
S

Eu criei um array que recebe o ID e Descrição da classe produto e a quantidade da Classe ItemDoPedido, e essa classe dá um extend na classe Produto. Só que cada vez que execute o método no bean que adiciona os valores no carrinho, ele pega o último valor + o atual, e assim exponencialmente, o que eu estou fazendo de errado ?

Classes modelo:

ItemDoPedido:

public class ItemDoPedido{

private int id;
public int quantidade;
public Produto p;

//getters and setters

Produto

public class Produto{

public int id;
public String descricao;

Meu Bean

@ManagedBean(name = CarrinhoMB)

@SessionScoped

public class carrinhoMB {
//Carrinho de compras
private ItemDoPedido item = new ItemDoPedido();
private ItemdoPedidoDAO idao = new ItemdoPedidoDAO();
private List<ItemDoPedido> carrinho = new ArrayList<>();

//Lista de produtos
private Produto produto;
private List<Produto> produtos;
private ProdutoDAO pDAO = new ProdutoDAO();

//getters and setter feitos

public carrinhoMB() {
    produto = new Produto();
    produtos = pDAO.MostrarProdutos();
}


public void adicionarCarrinho(Produto produto) {
    //inserindo duplicado 
    item.setP(produto);
    item.setQuantidade(1);
    carrinho.add(item);

}

Minha tela.xhtml

<p:panel header=“Produtos disponíveis”>

<p:dataTable var=“produto” value="#{produtoMB.produtos}"  scrollable=“true” scrollWidth=“1200px” scrollHeight=“200”>

<p:column  headerText=“Id”>

<h:outputText value="#{produto.id}" />

</p:column>
<p:column  headerText="Descrição">
                        <h:outputText value="#{produto.descricao}" />
                    </p:column>

                    <p:column headerText="Adicionar">
                        <p:commandButton value="Adicionar" id="carrinho" action="#{CarrinhoMB.adicionarCarrinho(produto)}" styleClass="ui-priority-primary" ajax="false"/>
                    </p:column>
                </p:dataTable>
            </p:panel>

            <br></br>
            <br></br>

            <p:panel header="Carrinho">
                <p:dataTable var="carrinho" value="#{CarrinhoMB.carrinho}">
                    
                    <p:column  headerText="ID Produto">
                        <h:outputText value="#{carrinho.p.id}" />
                    </p:column>


                    <p:column  headerText="Produto">
                        <h:outputText value="#{carrinho.p.descricao}" />
                    </p:column>

                    <p:column  headerText="Quantidade">
                        <h:outputText value="#{carrinho.quantidade}" />
                    </p:column>

                    <p:column headerText="Aumentar">
                        <p:commandButton value="Aumentar" id="aumentar" action="#{CarrinhoMB.aumentar()}" styleClass="ui-priority-primary" ajax="false"/>
                    </p:column>

                    <p:column headerText="Diminuir">
                        <p:commandButton value="Diminuir" id="diminuir" action="#{CarrinhoMB.diminuir()}" styleClass="ui-priority-primary" ajax="false"/>
                    </p:column>

                    <p:column headerText="Excluir">
                        <p:commandButton value="Excluir" id="excluir" action="#{CarrinhoMB.removerCarrinho()}" styleClass="ui-priority-primary" ajax="false"/>
                    </p:column>
                </p:dataTable>

                <br></br>
                <br></br>

                <p:commandButton value="Finalizar" id="finalizar" action="#{CarrinhoMB.finalizarCarrinho()}" styleClass="ui-priority-primary" ajax="false"/>

Ele fica assim, eu escolhi três produtos diferentes, sendo o último borracha.

3 Respostas

Mike

Boa tarde!

public void adicionarCarrinho(Produto produto) {
        //inserindo duplicado 
        item.setP(produto);
        item.setQuantidade(1);
        carrinho.add(item);
}

Você deve criar uma instância de item cada vez que for adicionar no carrinho :+1:

S

Boa tarde;
Mas não tem alguma forma de declarar fora do método e limpar o que foi inserido anteriormente ?

Mike

Declarar o que fora do método? Limpar o que? Você não quer deixar tudo no carrinho?

A única coisa que precisa é criar um novo objeto do tipo Item e então inserir na lista.

Você esta sempre mudando o produto do Item e nunca criando um novo item, por isso que os valores no array estão sendo repetidos, pq você esta sempre adicionando a mesma referencia (mesmo item) e então altera o valor do produto

Criado 4 de março de 2019
Ultima resposta 4 de mar. de 2019
Respostas 3
Participantes 2