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

Deletar o Item da Tabela pelo p:Dialog

Estou Tentando deletar o item da tabela a partir de um p:Dialog e não estou conseguindo



    public String Remove() {
        this.objRb.Remove(this.pessoa);

        return "";
    }
<?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">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:p="http://primefaces.org/ui">


    <h:head>
        <title>Título da página (seção head necessária ao Primefaces)</title>
    </h:head>


<h:body>


<p:layout fullPage="true">

   <p:layoutUnit position="north" size="100">
                teste
   </p:layoutUnit>

    <p:layoutUnit position="west" resizable="false" size="245" >
     <h:form >
        <p:menu  />

    <h3>Toggleable</h3>
    <p:menu toggleable="true">
        <p:submenu label="Ajax">
            <p:menuitem value="Save" icon="ui-icon-disk" />
            <p:menuitem value="Update"  icon="ui-icon-arrowrefresh-1-w"/>
        </p:submenu>
        <p:submenu label="Non-Ajax">
            <p:menuitem value="Delete"   ajax="false" icon="ui-icon-close"/>
        </p:submenu>
        <p:submenu label="Navigations">
            <p:menuitem value="External" url="http://www.primefaces.org" icon="ui-icon-home"/>

        </p:submenu>
    </p:menu>
    </h:form  >
    </p:layoutUnit>

    <p:layoutUnit position="center">
        <h:form id="teste">
         <p:growl id="msgs" showDetail="true" />
        <legend>Dados Pessoa</legend>
        <h:panelGrid>

            <h:outputLabel value = "Nome:" for="Nome" />
            <h:inputText id="Nome" value = "#{pessoaBean.pessoa.nome}"/>
            <h:outputLabel value = "Mae:" for="Mae" />
            <h:inputText id="Mae"/>
            <h:outputLabel value = "Pai:" for="Pai" />
            <h:inputText id="Pai"/>
            <p:commandButton value="Salvar" action="#{pessoaBean.gravar}" update="@form" process="@form" />
        </h:panelGrid>








    <h:panelGrid columns="3">
                <p:inputText value="#{pessoaBean.filtro.descricao}" id="descricao"/>

                <p:commandButton value="Consultar" update="tablePessoa" process="@form" />
    </h:panelGrid>

    <p:dataTable id="tablePessoa" var="pessoa" value="#{pessoaBean.model}" rows="5" lazy="true"
                         paginator="true"
                         paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                         rowsPerPageTemplate="5,10,15" currentPageReportTemplate="Página: {currentPage} de {totalPages} " >
        <p:column headerText="nome">
            <h:outputText value="#{pessoa.nome}" />
        </p:column>
       <p:column style="width:32px;text-align: center">
             <p:commandButton update="form:carDetail" oncomplete="PF('carDialog').show()" icon="ui-icon-search" title="View" >
                <f:setPropertyActionListener value="#{pessoa}" target="#{pessoaBean.pessoa}" />
            </p:commandButton>
        </p:column>

    </p:dataTable>



</h:form>

    </p:layoutUnit>
</p:layout>

<h:form id="form">

  <p:dialog header="Car Info" widgetVar="carDialog" modal="true" showEffect="fade" hideEffect="fade" resizable="false">
        <p:outputPanel id="carDetail" style="text-align:center;">
            <p:panelGrid  columns="2" rendered="#{not empty pessoaBean.pessoa}" columnClasses="value">
                <f:facet name="header">

                </f:facet>

                <h:outputText value="Nome:" />
                <h:outputText value="#{pessoaBean.pessoa.nome}" />


            </p:panelGrid>
        </p:outputPanel>
      <p:growl id="growl" life="2000" />

     <h:commandLink action="#{pessoaBean.Remove}" immediate="true"> 
           <h:outputText value="Delete" />                    
          <f:setPropertyActionListener value="#{pessoa}" target="#{pessoaBean.pessoa}" />
          <p:ajax update="teste:tablePessoa"/> 
     </h:commandLink>




    </p:dialog>






    </h:form>
</h:body>

</html>

ago 27, 2017 10:52:13 PM com.sun.faces.lifecycle.ApplyRequestValuesPhase execute ADVERTÊNCIA: #{pessoaBean.Remove}: java.lang.IllegalArgumentException: attempt to create delete event with null entity javax.faces.FacesException: #{pessoaBean.Remove}: java.lang.IllegalArgumentException: attempt to create delete event with null entity

16 respostas

Lauro tudo bem? Cara que código confuso, até fiquei perdido aqui misturando pessoaBean com dialog de carro!

Vamos melhorar isso? Acho que também seu código não precisa de abrir um outro dialog mostrando a pessoa que você quer excluir, faz de um jeito mais simples, mais facil de entender, e simples também para quem for usar...

O seguinte, a primeira coisa que eu reparei foi você salvar apenas o nome da pessoa, se você quiser salvar o nome da mae e do pai não está salvando, observe.

<h:outputLabel value = "Nome:" for="Nome" />
            <h:inputText id="Nome" value = "#{pessoaBean.pessoa.nome}"/>
            <h:outputLabel value = "Mae:" for="Mae" />
            <h:inputText id="Mae"/>
            <h:outputLabel value = "Pai:" for="Pai" />
            <h:inputText id="Pai"/>

Você não está ligando do nome do pai e nem da mae, apenas da pessoaBean.pessoa.nome

Mais isso é apenas um detalhe que reparei, vamos melhorar seu código.

 <p:dataTable id="tablePessoa" var="pessoa" value="#{pessoaBean.model}" rows="5" lazy="true"
                         paginator="true"
                         paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                         rowsPerPageTemplate="5,10,15" currentPageReportTemplate="Página: {currentPage} de {totalPages} " >
        <p:column headerText="nome">
            <h:outputText value="#{pessoa.nome}" />
        </p:column>
       <p:column headerText="Opção">
        <p:commandButton value="Excluir" actionListener="#{pessoaBean.remover(pessoa)}" 
</p:column>

E no seu bean muda seu metodo para.

 public String remover(Pessoa pessoa) {
        this.objRb.Remove(pessoa);
    return "";
    }

O restante do código apaga deixando assim.

Alisson, sobre o código, estou só testando, então o código esta meio doido mesmo. rsrs. Eu sou novo neste forum, comecei a fazer o curso de jsf no alura e gostei e estou testando. Em quanto ao codigo , estou só gravando o nome mesmo, só para testar como o nome funciona sei que o resto vai funcionar. enquanto a não precisar do dialog, eu concordo que para deletar não precisa, era só um teste, mas se eu quiser abrir um dialog para alterar? creio que terei o mesmo problema.

Ah sim, o curso do JSF aqui da alura é muito bom, não não tera o mesmo problema, nem de excluir você tera problemas, é só acostumar e entender as fases da vida do JSF que você vai meio que apreender isso jaja.

Daquele jeito que você fez, a entidade está vindo nula, em nenhum momento você passo uma pessoa para excluir, tem varias formas de fazer isso, uma é que eu te passei, passando no parametro do metodo uma pessoa.

actionListener="#{pessoaBean.remover(pessoa)}"

e no bean

public String remover(Pessoa pessoa) {
        this.objRb.Remove(pessoa);
    return "";
    }

Uma outra é fazendo o próprio update dentro da pagina html, algo como.

 <p:column headerText="Opção">
        <p:commandButton value="Excluir" actionListener="#{pessoaBean.prepararExclusao(pessoa)}" update=":form" />
</p:column>

e no bean.

public void prepararExclusao(Pessoa pessoa) {
    this.pessoa = pessoa;
}

Ai no seu dialog.

<h:form id="form">

  <p:dialog header="Car Info" widgetVar="carDialog" modal="true" showEffect="fade" hideEffect="fade" resizable="false">
        <p:outputPanel id="carDetail" style="text-align:center;">
            <p:panelGrid  columns="3" rendered="#{not empty pessoaBean.pessoa}" columnClasses="value">
                <f:facet name="header">

                </f:facet>

                <h:outputText value="Nome:" />
                <h:outputText value="#{pessoaBean.pessoa.nome}" />
        <p:commandButton value="Excluir" actionListener="#{pessoaBean.remover}" />

            </p:panelGrid>
        </p:outputPanel>
      <p:growl id="growl" life="2000" />
</p:dialog>
</h:form>

e novamente no seu bean.

public String remover() {
        this.objRb.Remove(this.pessoa);
    return "";
    }

Assim é possivel remover da maneira que você quer...

Tentei o que você passou, deu o mesmo erro.

Hibernate: select count(*) as y0 from Pessoa this ago 28, 2017 2:02:20 AM org.hibernate.internal.SessionImpl createCriteria WARN: HHH90000022: Hibernate's legacy org.hibernate.Criteria API is deprecated; use the JPA javax.persistence.criteria.CriteriaQuery instead Hibernate: select this.pessoaId as pessoaId1_0_1, this.Mae as Mae2_0_1, this.Pai as Pai3_0_1, this.apelido as apelido4_0_1, this.cpf as cpf5_0_1, this.dataCadastro as dataCada6_0_1, this.dataNascimento as dataNasc7_0_1, this.nome as nome8_0_1, this.profissao_profissaoId as profiss10_0_1, this.rg as rg9_0_1, profissao2.profissaoId as profissa1_1_0, profissao2.dataCadastro as dataCada2_1_0, profissao2.descricao as descrica3_1_0 from Pessoa this left outer join Profissao profissao2 on this.profissao_profissaoId=profissao2.profissaoId limit ? ago 28, 2017 2:02:30 AM com.sun.faces.lifecycle.ApplyRequestValuesPhase execute ADVERTÊNCIA: #{pessoaBean.remover}: java.lang.IllegalArgumentException: attempt to create delete event with null entity javax.faces.FacesException: #{pessoaBean.remover}: java.lang.IllegalArgumentException: attempt to create delete event with null entity at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:119) at javax.faces.component.UICommand.broadcast(UICommand.java:330) at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:870) at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:1034) at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:79) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:201) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:670) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

acho que fiz errado.

esse botão ficaria onde?

Lauro tenta colocar no seu botão para abrir o dialog do seu carDialog.

 <p:commandButton value="Excluir" actionListener="#{pessoaBean.prepararExclusao(pessoa)}" update=":form" oncomplete="PF('carDialog').show();"/>

E me passa o código seu para remover, que deve tar no seu dao.

Allison, bom dia. Estou no trabalho e meu projeto esta em casa, no horário do almoço eu passo o código.

Allison, segue codigo

package ubbCup.Infra.Data.Repositories;


import java.io.Serializable;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaQuery;

import org.apache.commons.lang3.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;







public class RepositoryBase <TEntity> implements Serializable    {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private final Class<TEntity> Classe;
    private EntityManager objEM;


    public RepositoryBase(EntityManager manager, Class<TEntity> Classe) {

        this.objEM = manager;
        this.Classe = Classe;

    }


    public void Add(TEntity obj) {
        // TODO Auto-generated method stub

        objEM.getTransaction().begin();
        objEM.persist(obj);
        objEM.getTransaction().commit();

    }


    public TEntity GetById(int id) {
        // TODO Auto-generated method stub
        TEntity obj = objEM.find(Classe, id);
        objEM.close();
        return obj;
    }


    public Iterable<TEntity> GetAll() {
        // TODO Auto-generated method stub
        return null;
    }


    public void Update(TEntity obj) {
        // TODO Auto-generated method stub

    }


    public void Remove(TEntity obj) {
        objEM.remove(obj);

    }


    public void Dispose() {
        // TODO Auto-generated method stub

    }

    public List<TEntity> listaTodos() {

        CriteriaQuery<TEntity> query = objEM.getCriteriaBuilder().createQuery(Classe);
        query.select(query.from(Classe));

        List<TEntity> lista = objEM.createQuery(query).getResultList();


        return lista;
    }

    @SuppressWarnings("unchecked")
    public List<TEntity> filtrados(Filtro filtro) {
        Criteria criteria = criarCriteriaParaFiltro(filtro);

        criteria.setFirstResult(filtro.getPrimeiroRegistro());
        criteria.setMaxResults(filtro.getQuantidadeRegistros());

        if (filtro.isAscendente() && filtro.getPropriedadeOrdenacao() != null) {
            criteria.addOrder(Order.asc(filtro.getPropriedadeOrdenacao()));
        } else if (filtro.getPropriedadeOrdenacao() != null) {
            criteria.addOrder(Order.desc(filtro.getPropriedadeOrdenacao()));
        }

        return criteria.list();
    }

    private Criteria criarCriteriaParaFiltro(Filtro filtro) {
        Session session = objEM.unwrap(Session.class);
        @SuppressWarnings("deprecation")
        Criteria criteria = session.createCriteria(Classe);

        if (StringUtils.isNotEmpty(filtro.getDescricao())) {
            criteria.add(Restrictions.ilike("descricao", filtro.getDescricao(), MatchMode.ANYWHERE));
        }

        return criteria;
    }

    public int quantidadeFiltrados(Filtro filtro) {
        Criteria criteria = criarCriteriaParaFiltro(filtro);

        criteria.setProjection(Projections.rowCount());

        return ((Number) criteria.uniqueResult()).intValue();
    }

}

package ubbCup.Infra.Data.Repositories;

import java.io.Serializable; import java.util.List;

import javax.annotation.PostConstruct; import javax.inject.Inject; import javax.persistence.EntityManager;

import ubbCup.Domain.Entities.Pessoa;

public class RepositoryPessoa implements Serializable {

/* */ private static final long serialVersionUID = 1L;

@Inject EntityManager objEm;

private RepositoryBase objRb;

@PostConstruct void init() { this.objRb = new RepositoryBase(this.objEm, Pessoa.class); }

public List filtrados(Filtro filtro) { return objRb.filtrados(filtro); }

public int quantidadeFiltrados(Filtro filtro) { return objRb.quantidadeFiltrados(filtro); }

public List listaTodos() { return objRb.listaTodos(); }

public void Add(Pessoa obj) { objRb.Add(obj); }

public Iterable GetAll() { return objRb.GetAll(); }

public void Update(Pessoa obj) { objRb.Update(obj); }

public void Remove(Pessoa obj) { objRb.Remove(obj); }

}

Tentei fazer o que voce passou, não deu certo, o botão não tem ação é como se o action não funcionasse, tentei com o commandLink mas não foi, não chamou o remover.

   <h:commandLink action="#{pessoaBean.remover}" immediate="true"> 
           <h:outputText value="Delete" />                    
          <p:ajax update="teste:tablePessoa"/> 
     </h:commandLink>

Faz um teste para mim, no seu metodo remover no dao tá assim.

public void Remove(TEntity obj) {
        objEM.remove(obj);

    }

Troca para.

public void Remove(Pessoa pessoa) {
        objEM.remove(pessoa);

    }

E roda para mim ver kk

Mas o método do RepositoryPessoa já assim,

se eu colocar assim o RepositoryBase vou ter que mudar tudo. Porque no Bean eu ja uso o RepositoryPessoa

Lauro então faz outro metodo, só para o teste mesmo.

public void Remove1(Pessoa pessoa) {
        objEM.remove(pessoa);

    }

e no bean chama ele.

public String remover() {
        this.objRb.Remove1(this.pessoa);
    return "";
    }

Alisson, não deu certo, como estou usando cdi estou usando o inject ai da erro para subir o tomcat pois não esta configurado. posso testar instanciando normal.

Alisson, boa noite. Estranho, eu fiz um Debug e o sistema entra no remove e a entidade pessoa não esta null, mas não deleta.

Allison, antes de mais nada, obrigado pelo tempo, descobri o erro, eu não estava iniciando uma transação do delete, eu ainda não tinha feito a classe que controla o inicio e o commit da transação, ai não ia né.

solução!

Nossa é verdadeeeeeee kkkkk, passei vuado nessa parte, até porque você falo que usava CDI e achei que você tivesse configurado para o CDI tomar a decisão quando abrir e fechar e comitar a transação kkkkkkkk, muito boom cara, isso mesmo. é nois