Problema no arraylist + jsf + primefaces

10 respostas
V

Estou desenvolvendo um ecommerce com jsf + hibernate + primefaces + jpa. Estou na parte de adicionar itens a venda e isso faço usando arraylist. Só que quando adiciono um produto ao array é mostrado na tabela o produto adicionado corretamente. Porém quando adiciono mais um produto ao array parece que substitui o objeto anterior do produto. Abaixo está o código da classe controller:

public void preencherItem(){
        items.add(itemvenda);
        atualizarQuantidade(itemvenda.getProduto().getId(), itemvenda.getQuantidade());
        atualizarPrecoVenda("incrementar", itemvenda.getProduto().getPrecovenda(), itemvenda.getQuantidade());
    }

O arquivo .xhtml:

<p:dialog id="adicionarItem" width="500" resizable="no" widgetVar="adicionarItemVenda" header="ADICIONAR ITEM À VENDA RÁPIDA" modal="true" height="600">
                <h:form id="formAdicionarItemVenda">
                    <p:messages id="msgs" autoUpdate="true"/>
                    <h:panelGrid columns="2" cellpadding="4">
                        <h:outputLabel value="Produto:" for="produto"/>
                        <p:selectOneMenu value="#{vendaRapidaBean.itemvenda.produto}" converter="bancoConverter" panelStyle="width:150px"  
                         effect="fade" var="p" style="width:160px"  filter="true" filterMatchMode="startsWith">  
                            <f:selectItem itemLabel="Selecione" itemValue=""/>
                            <f:selectItems value="#{produtoBean.produtos}" var="itens" itemValue="#{itens}" itemLabel="#{itens.nome}"/>
                            <p:column>
                                #{p.nome}
                            </p:column>
                            <p:column>
                                #{p.precovenda}
                            </p:column>
                            <p:column>
                                #{p.quantidade}
                            </p:column>
                        </p:selectOneMenu>
                        <h:outputLabel value="Quantidade:" for="quantidade"></h:outputLabel>
                        <h:inputText id="quantidade" value="#{vendaRapidaBean.itemvenda.quantidade}"/>
                        <h:outputLabel value="Itens da venda:" for="itens"></h:outputLabel>
                        <p:dataTable id="itemvenda" value="#{vendaRapidaBean.items}" selectionMode="single" rowKey="#{item.produto.id}" var="item" emptyMessage="Nenhum registro incluido." paginator="true" rows="10">
                            <f:facet name="header">
                                LISTA DE ITEM DE VENDAS RÁPIDAS
                            </f:facet>
                            <p:column headerText="NOME" style="text-align: center">
                                <h:outputText value="#{item.produto.nome}" />
                            </p:column>
                            <p:column headerText="QUANTIDADE" style="text-align: center">
                                <h:outputText value="#{item.quantidade}" />
                            </p:column>
                            <p:column headerText="EXCLUIR" style="text-align: center">
                                <p:commandButton value="EXCLUIR" title="Excluir" onclick="confirmationItem.show()" ajax="true" style="margin-left: 5px"/>
                            </p:column>
                        </p:dataTable>
                    </h:panelGrid>
                    <p:commandButton id="btnAdicionar" value="ADICIONAR" actionListener="#{vendaRapidaBean.preencherItem}" update=":formAdicionarItemVenda:itemvenda"/>
                    <p:commandButton id="btnCancelar" value="FECHAR" oncomplete="adicionarItemVenda.hide()" process="@all" update=":formCadastroVenda"/>
                </h:form>
            </p:dialog>
            <h:form id="dlgItem">
                <p:confirmDialog message="Deseja realmente excluir este item da venda?" hideEffect="explode" header="Aviso" severity="alert" widgetVar="confirmationItem">
                    <p:commandButton id="btnSim" value="Sim" oncomplete="confirmationItem.hide();" actionListener="#{vendaRapidaBean.removerItem}" update=":formAdicionarItemVenda:itemvenda"/>
                    <p:commandButton id="btnNao" value="Não" onclick="confirmationItem.hide()" type="button"/>
                </p:confirmDialog>
            </h:form>

O que pode ser?

10 Respostas

R

Quando vc adiciona vc está adicionando um objeto certo??? o tal “itemvenda”.

Você precisa colocar no pdatatable o seguinte:

selection="#{vendaRapidaBean.itemvenda}"

Isso para que ao selecionar no datatable, o objeto itemvenda receba o valor da linha selecionada.

Abraços

V

Está do jeito que vc falou, gravando objeto correto, mas na tabela aparece somente o ultimo objeto inserido.

Alguma sugestão?

R

vc debugou para ver se o list está com todos os valores inseridos? Se sim, tente usar o update="@form" no lugar de update=":formAdicionarItemVenda:itemvenda" só pra ver se atualiza.

V

A tabela está atualizando qdo clico no botão adicionar.
O problema é qdo há um objeto já inserido e listado na tabela e insiro um outro objeto ele substitui o existente na tabela mas debuguei o método e o método está correto, só não sei o motivo de ele estar fazendo isso.
Alguma sugestão?

D

após adicionar o itemvenda na lista você esta criando uma nova instancia para ele? pelo que vi no código não… geralmente esses problemas acontecem porque você adiciona sempre a mesma instancia na lista…

V

O método teria que ficar assim:

public void preencherItem(){
        items.add(itemvenda);
        atualizarQuantidade(itemvenda.getProduto().getId(), itemvenda.getQuantidade());
        atualizarPrecoVenda("incrementar", itemvenda.getProduto().getPrecovenda(), itemvenda.getQuantidade());
        itemvenda = new ItemVendaRapida();
    }

Se for assim não está dando certo.

D

nesse caso eu tentaria o seguinte.

popula essa lista com uns 3 ou 4 itens na hora da inicialização… se aparecer certinho na tabela… o seu problema deve ser que o update não esta funcionando corretamente.

se for isso… cria um <h:pannelGrid> com a tabela dentro… e tenta dar um update nesse pannelGrid…

guilherme_costa1

Em qual escopo está o seu ManagedBean?

Se estiver como @RequestScope, cada vez que você adicionar um item na lista, uma nova instância do seu managedBean está sendo criada e nesse caso sempre que você adicionar um item, seu ManagedBean vai ser criada com a lista vazia e quando você inserir o seu itemVenda, a lista estará vazia.

V

Está como SessionScoped.

L

in that case I would try the following.

Criado 15 de abril de 2014
Ultima resposta 30 de abr. de 2014
Respostas 10
Participantes 5