[RESOLVIDO]Jsf - problema removendo item de um ArrayList
19 respostas
K
kelvis
Help-me Galera!
Tenho um dataTable onde adiciono os contatos da pessoa numa lista… até ai blz
com a lista preenchida, quando clico no botão excluir, ao invés de remover o item desejado ele remove o que está acima dele :?:
não entendo o que tá acontecendo… :?: já debuguei e tudo, ele leva o objeto certo no método mas na hora que ele dá o remove deleta o Objeto errado!
o método que recebe o evento para remover
//Deleta um contato adicionado na Lista(Altera o status para excluido)publicvoidalterarStatusParaExcluido(EventoContatocontato)throwsException{if(contato.getId()==null){listaContatosPessoa.remove(contato);}else{try{contato.setSituacaoEvento(situacaoEventoServico.buscarPorId(SituacaoEvento.COD_EXCLUIDO));contatoServico.atualizar(contato);listaContatosPessoa.remove(contato);enviarMensagemInfo("excluisaoEvento",getMensagem("EVENTO.REGISTRO_EXCLUIDO_SUCESSO"));}catch(Exceptione){sessaoAtiva.getErrosSirf3().setException(e);throwe;}}}
Uma vez aconteceu isso comigo era porque eu não tinha implementado corretamente os metodos “equals e hash”.
Talvez possa ser isso que esteja acontecendo com você.
T+
Filipe.
K
kelvis
Pois éh cara… vou dar uma conferida aqui no meu Bean pra ver como é que tá o equals e hash code…
Depois posto se Deu certo!
Vlw
E
edudebom
Provavelmente ocorra esse problema para você quando você não tem o contato ainda cadastrado na base, então ele ainda não tem um ID. Se for um formulário de inserção aqui eu adiciono um ID sequencial e removo antes de gravar já que é auto-incremento.
K
kelvis
Então senhores… o problema era no equals e hashcode mesmo que não estava implementado de forma correta… eu não estava passando o ID…
Agora tá funfando!!
obrigado pela ajuda!!
G
gilmar_rj
Olá kelvis !
Estou começando com java e também estou tento esse problema tem como vc postar a implementação desses metodos.
Obrigado!
K
kelvis
gilmar_rj:
Olá kelvis !
Estou começando com java e também estou tento esse problema tem como vc postar a implementação desses metodos.
Obrigado!
Seguinte… vai no teu Objeto (Bean), clica com o botão direito do mouse e vai na seguinte opção SOURCE–>Generate hashCode() and equals(), daí vai abrir uma caixa de diálogo com as propriedas do teu Objeto você marca somente o ID e pronto… no fim da classe ele vai gerar os métodos automaticamente!
Tenho uma que se chama Boletim e outra ItemBoletim onde ela se relacionam até ai tudo bem, quando eu adiciona meus itens na lista não estou sabendo remover um determionado item passado por parametro da lista uma vez que o id esta como null pois ele esta com a anotação @id e @GeneratedValue.
Eu vi no seu post o uso no equals e do haschCode mas não estou sabendo implementar isso.
Eu tenhum metodo no meu BoletimMB que tenta fazer isso ou seja eu percorre minha lista e tento achar aquele determinado item que passo por paramentro.
packagebr.com.estub.boletim.mb;importjava.io.Serializable;importjava.util.List;importjavax.faces.bean.ManagedBean;importjavax.faces.bean.ManagedProperty;importjavax.faces.bean.ViewScoped;importorg.hibernate.cache.ReadWriteCache.Item;importbr.com.estub.boletim.modelo.Boletim;importbr.com.estub.boletim.modelo.Contrato;importbr.com.estub.boletim.modelo.ItemBoletim;importbr.com.estub.boletim.service.BoletimService;importbr.com.estub.boletim.util.JSFUtil;@ManagedBean(name="boletimMB")@ViewScopedpublicclassBoletimMBimplementsSerializable{privatestaticfinallongserialVersionUID=1L;@ManagedProperty("#{boletimService}")privateBoletimServicemodelo;privateBoletimboletim=newBoletim();privateList<Boletim>boletins=null;privateItemBoletimitem=newItemBoletim();privateContratocontrato=newContrato();publicBoletimServicegetModelo(){returnmodelo;}publicvoidsetModelo(BoletimServicemodelo){this.modelo=modelo;}publicBoletimgetBoletim(){returnboletim;}publicvoidsetBoletim(Boletimboletim){this.boletim=boletim;}publicList<Boletim>getBoletins(){if(this.boletins==null){this.boletins=modelo.listaTodos();}returnthis.boletins;}publicvoidsetBoletins(List<Boletim>boletins){this.boletins=boletins;}publicItemBoletimgetItem(){returnitem;}publicvoidsetItem(ItemBoletimitem){this.item=item;}publicContratogetContrato(){returncontrato;}publicvoidsetContrato(Contratocontrato){this.contrato=contrato;}publicStringacaoSalvar(){System.out.println("*****SALVANDO BOLETIM*****");this.boletim.setContrato(contrato);this.modelo.salvar(this.boletim);this.setBoletim(newBoletim());return"boletimListar.xhtml";}publicvoidalterar(){this.modelo.altera(boletim);}publicvoidguardaItem(){this.item.setBoletim(boletim);this.boletim.getItens().add(this.item);this.item=newItemBoletim();}publicvoidacaoExcluirItem(){System.out.println("*******EXLUINDO ITEM DA LISTA******");ItemBoletimobjetoDaLista=buscaItemNaLista();this.boletim.getItens().remove(objetoDaLista);}/* * Percorre a lista de itens que se encontra no boletim e compara com o id * do item passado pela requisição, logo em seguida o objeto é apagado. */privateItemBoletimbuscaItemNaLista(){// pega os dados da requisiçãoLongid=JSFUtil.getParametroLong("itemId");ItemBoletimuu=this.boletim.getItens().get(id);for(ItemBoletimtt:this.boletim.getItens().get(id)){if(tt.getId()==id){ItemBoletimobjetoDaLista=tt;returnobjetoDaLista;}}returnnull;}publicStringacaoExcluir(){System.out.println("***EXCLUINDO BOLETIM***");Longid=JSFUtil.getParametroLong("boletimId");BoletimobjetoDoBanco=this.modelo.getBuscaPorId(id);this.modelo.remover(objetoDoBanco);this.boletins=null;return"boletimListar";}publicStringacaoAbrirAlteracao(){Longid=JSFUtil.getParametroLong("boletimId");BoletimobjetoDoBanco=this.modelo.getBuscaPorId(id);this.setBoletim(objetoDoBanco);return"boletim";}publicvoidlimpaFormulario(){this.setBoletim(newBoletim());this.setContrato(newContrato());this.setItem(newItemBoletim());}}
<?xml version="1.0" encoding="ISO-8859-1" ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="http://www.w3.org/1999/xhtml"xmlns:f="http://java.sun.com/jsf/core"xmlns:h="http://java.sun.com/jsf/html"xmlns:ui="http://java.sun.com/jsf/facelets"xmlns:p="http://primefaces.prime.com.tr/ui"><ui:compositiontemplate="_templete.xhtml"><ui:definename="titulo">Cadastra Boletim de Caixa</ui:define><ui:definename="conteudo"><h2></h2><h:formid="formulario"><h:panelGridcolumns="2"><h:outputLabelvalue="Contrato:* "for="contrato"/><p:inputMaskid="contrato"value="#{boletimMB.contrato.codigo}"mask="a*-99/9999"required="true"label="Campo Contrato"/><h:outputLabelvalue="Boletim:* "for="boletim"/><p:inputTextid="boletim"value="#{boletimMB.boletim.codigo}"required="true"label="Campo Boletim"/></h:panelGrid><h:formid="formItem"><p:fieldsetlegend="Itens do Boletim"toggleable="true"><h:panelGridcolumns="4"><h:outputLabelvalue="Data:* "for="data"/><p:calendarpattern="dd/MM/yyyy"mode="popup"showOn="button"id="data"required="true"label="Campo Data"value="#{boletimMB.item.data.time}"><f:convertDateTimepattern="dd/MM/yyyy"/></p:calendar><h:outputLabelvalue="Frete: "for="frete"/><p:inputTextid="frete"value="#{boletimMB.item.frete}"/><h:outputLabelvalue="Custo de Deslocamento: "for="cust"/><p:inputTextid="cust"value="#{boletimMB.item.custoDeslocamento}"/><h:outputLabelvalue="Mão de Obra Tercerizada: "for="maoDeObra"/><p:inputTextid="maoDeObra"value="#{boletimMB.item.maoDeObraTercerizada}"/><h:outputLabelvalue="Refeição: "for="ref"/><p:inputTextid="ref"value="#{boletimMB.item.refeicao}"/><h:outputLabelvalue="Hospedagem: "for="hosp"/><p:inputTextid="hosp"value="#{boletimMB.item.hospedagem}"/><h:outputLabelvalue="Documentação: "for="doc"/><p:inputTextid="doc"value="#{boletimMB.item.documentacao}"/><h:outputLabelvalue="Outras Despesas: "for="outras"/><p:inputTextid="outras"value="#{boletimMB.item.outrasDespesas}"/><f:facetname="footer"><h:panelGrouplayout="block"style="text-align: center"><p:commandButtonajax="false"action="#{boletimMB.guardaItem}"id="btnIncluir"value="Guarda Item"></p:commandButton></h:panelGroup></f:facet></h:panelGrid></p:fieldset><p:dataTableid="listar"var="item"value="#{boletimMB.boletim.itens}"widgetVar="carsTable"paginator="true"rows="3"rowsPerPageTemplate="5,10,15"selectionMode="single"><f:facetname="header">
Itens Boletim
</f:facet><p:column><f:facetname="header">Data</f:facet><h:outputTextvalue="#{item.data.time}"></h:outputText></p:column><p:columnheaderText="Frete"><h:outputTextvalue="#{item.frete}"><f:convertNumbertype="currency"currencySymbol="R$ "locale="pt_BR"></f:convertNumber></h:outputText></p:column><p:columnheaderText="Custo de Deslocamento"><h:outputTextvalue="#{item.custoDeslocamento}"><f:convertNumbertype="currency"currencySymbol="R$ "locale="pt_BR"></f:convertNumber></h:outputText></p:column><p:columnheaderText="Mão de Obra Tercerizada"><h:outputTextvalue="#{item.maoDeObraTercerizada}"><f:convertNumbertype="currency"currencySymbol="R$ "locale="pt_BR"></f:convertNumber></h:outputText></p:column><p:columnheaderText="refeicao"><h:outputTextvalue="#{item.refeicao}"><f:convertNumbertype="currency"currencySymbol="R$ "locale="pt_BR"></f:convertNumber></h:outputText></p:column><p:columnheaderText="Hospedagem"><h:outputTextvalue="#{item.hospedagem}"><f:convertNumbertype="currency"currencySymbol="R$ "locale="pt_BR"></f:convertNumber></h:outputText></p:column><p:columnheaderText="Documentação"><h:outputTextvalue="#{item.documentacao}"><f:convertNumbertype="currency"currencySymbol="R$ "locale="pt_BR"></f:convertNumber></h:outputText></p:column><p:columnheaderText="Outras Despesas"><h:outputTextvalue="#{item.outrasDespesas}"><f:convertNumbertype="currency"currencySymbol="R$ "locale="pt_BR"></f:convertNumber></h:outputText></p:column><p:column><f:facetname="header"><h:outputTextvalue="Ações"/></f:facet><h:panelGroup><p:commandButtontype="button"value="Excluir"onclick="conf#{item.id}.show()"image="ui-icon-close"></p:commandButton><p:confirmDialogmessage="Deseja excluir este registro?"showEffect="bounce"hideEffect="explode"header="Confirmação de Exclusão"severity="alert"widgetVar="conf#{item.id}"><p:commandButtonajax="false"type="push"value="Sim"action="#{boletimMB.acaoExcluirItem}"immediate="true"image="ui-icon-check"><f:paramvalue="#{item.id}"name="itemId"/></p:commandButton><p:commandButtonvalue="Não"onclick="conf#{item.id}.hide()"type="button"image="ui-icon-close"/></p:confirmDialog></h:panelGroup></p:column><f:facetname="footer"><h:panelGrouplayout="block"style="text-align: center"><p:commandButtonaction="#{boletimMB.acaoSalvar}"value="Salvar"><!-- <f:ajax execute=":formulario" render=":formulario :formulario:formularioItem"></f:ajax> --></p:commandButton></h:panelGroup></f:facet></p:dataTable></h:form></h:form></ui:define></ui:composition></html>
K
kelvis
Cara, se a lista “itens” contém objetos com id(persistidos no banco) e sem id(novos itens adicionados) pra não ficar percorrendo lista e escrevendo código a tôa, faz o seguinte, ao invés de passar o id como parâmetro no botão excluir você faz:
Muda seu método acaoExcluirItem() para receber o objeto itemBoletim
Daí no botão excluir No action tú passa o “var” do teu dataTable dentro do construtor assim
action="#{boletimMB.acaoExcluirItem(item)}"
Pronto! Vc não vão precisar do método buscaItemDaLista()… Ele já saberá de qual item se trata independente de ter sido persistido ou não e remove… Pelo menos usando richFaces eu faço assim, diga ai se com primeFaces funfa… Tenta ai
G
gilmar_rj
Ola kelvis !
Fiz o que vc falou deu certo, agora está acontecendo o que aconteceu com vc, ou seja, ao excluir um item ele exclui o primeiro e não o que eu pedir para exclui. Na minha classe ItemBoletim eu implementei os metodos equals e equals so com o id assim como vc falou mas não esta resolvendo, pode me falar o que pode estar acontecendo?
Acontece que o Hibernate provavelmente está fazendo o carregamento tardio desse objeto e colocando ele dentro de uma implementação chamada “javassist”, dessa forma ele se perde na hora de comparar os objetos e exclui o valor errado! Testa ai e depois posta o resultado blz
G
gilmar_rj
Olá, fiz o teste que vc falou mas acontece a mesma coisa.
G
gilmar_rj
Ola, outra coisa estou usando o JPA com implementação do Hibernate não sei se isso tem alguma coisa a ver.
K
kelvis
Cara, dá um Clean no teu projeto ai e no Servidor de aplicação e limpa o cache do navegador e faz novamente, se persistir avisa que vamos pesquisar e procurar uma outra solução blz
G
gilmar_rj
Eu ja tinha feito isso, fiz novamente agora pra ver se dava sorte mas continua a mesma coisa.
G
gilmar_rj
.
K
kelvis
outra coisa, faz equals e hashCode na tua classe Boletim tbm e acrescenta aquela parada do javassist que coloquei lá
G
gilmar_rj
Fiz o que vc falou gerei os respectivos métodos na classe Boletim e ItemBoletim
Mas esta acontecendo a mesma coisa.