Esse código é responsável por exibir uma tabela com documentos cadastrados. Essa tabela possui as opções de editar e excluir cada registro.
Abaixo da tabela tem um botão que chama um formulário de cadastro de um novo documento. Esse formulário é criado dentro de um um dialog.
Meu problema é que quando crio outro dialog para pedir confirmação de exclusão para o usuário ele não passa nenhum parametro para o bean para o documento ser excluído.
Segue o código:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:decorate xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
template="template.xhtml">
<ui:define name="content">
<!--nada do estado do JSF será salvo e as visualizações nunca irão expirar, apenas serão reconstruídas
do zero em todas as solicitações. Você pode ativar as visualizações sem estado configurando o
transientatributo de <f:view>para true-->
<f:view transient="true">
<h2>Documento Macro</h2>
<h:form id="tabDocMacro" style="width: 900px" rendered="true">
<p:dataTable id="tblDocMacro" var="documentoMacro" value="#{documentoMacroMB.lista}" lazy="true"
style="margin-top:0" scrollable="true" scrollHeight="300" rendered="true">
<p:column style="width: 70px">
<f:facet name="header">
<h:outputText value="ID"/>
</f:facet>
<h:outputText value="#{documentoMacro.iddocumentomacro}"/>
</p:column>
<p:column style="width: 100px">
<f:facet name="header">
<h:outputText value="Código"/>
</f:facet>
<h:outputText value="#{documentoMacro.iddocumentofisico}"/>
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Título"/>
</f:facet>
<h:outputText value="#{documentoMacro.titulo}"/>
</p:column>
<p:column style="width:70px; text-align: center">
<f:facet name="header">
<h:outputText value="Documento Micro"/>
</f:facet>
<p:commandLink title="Adicionar Documento Micro" class="fa fa-copy fa-lg"
action="#{documentoMacroMB.listarDocumentoMicro()}" style="color: #333333">
<f:setPropertyActionListener target="#{documentoMacroMB.documentoMacro}" value="#{documentoMacro}"/>
</p:commandLink>
</p:column>
<p:column style="width:70px; text-align: center">
<f:facet name="header">
<h:outputText value="Imagens"/>
</f:facet>
<p:commandLink title="Gerenciar Imagens" class="fa fa-picture-o fa-lg"
action="#{imagemMB.listarImagem()}" style="color: #333333">
<f:setPropertyActionListener target="#{imagemMB.documentoMacro}" value="#{documentoMacro}"/>
</p:commandLink>
</p:column>
<p:column style="width:70px; text-align: center">
<f:facet name="header">
<h:outputText value="Ações"/>
</f:facet>
<p:commandLink title="Editar" class="fa fa-pencil fa-lg"
style="color: #333333" oncomplete="PF('cadastroDocumentoMacro').show()"
process="@this" update=":cadastroObra" actionListener="#{documentoMacroMB.setDocumentoMacro(documentoMacro)}">
<f:param name="idMacro" value="#{documentoMacroMB.id}"/>
<f:setPropertyActionListener value="#{documentoMacroMB.documentoMacro}" target="#{documentoMicroMB.documentoMacro}"/>
</p:commandLink>
<p:spacer width="20"/>
<p:commandLink title="Excluir" class="fa fa-trash fa-lg"
style="color: #333333" process="@this" update=":tabDocMacro:tblDocMacro"
oncomplete="PF('exclusaoDocumentoMacro').show()">
</p:commandLink>
</p:column>
</p:dataTable>
<p:commandButton value="Novo" oncomplete="PF('cadastroDocumentoMacro').show()" process="@this" update=":cadastroObra">
<f:param name="idMacro" value="#{documentoMacroMB.id}"/>
<f:setPropertyActionListener value="#{documentoMacroMB.documentoMacro}" target="#{documentoMicroMB.documentoMacro}"/>
</p:commandButton>
</h:form>
<p:dialog modal="true" height="500" width="900" widgetVar="cadastroDocumentoMacro">
<h:form id="cadastroObra">
<p:panelGrid columns="2" styleClass="semBorda">
<p:outputLabel value="Id" for="id"/>
<p:inputText id="id" value="#{documentoMacroMB.documentoMacro.iddocumentomacro}" maxlength="10" required="true" requiredMessage="Campo id é obrigatorio."/>
</p:panelGrid>
<p:panelGrid columns="2" styleClass="semBorda">
<p:outputLabel value="Código" for="codigo"/>
<p:inputText id="codigo" value="#{documentoMacroMB.documentoMacro.iddocumentofisico}" maxlength="10" required="true" requiredMessage="Campo código é obrigatorio."/>
</p:panelGrid>
<p:panelGrid columns="2" styleClass="semBorda">
<p:outputLabel value="Título" for="titulo"/>
<p:inputText id="titulo" value="#{documentoMacroMB.documentoMacro.titulo}" style="width: 600px" maxlength="50" required="true" requiredMessage="Campo título é obrigatorio."/>
</p:panelGrid>
<p:panelGrid columns="4" styleClass="semBorda">
<p:outputLabel value="Ano Inicial" for="anoInicial"/>
<p:inputText id="anoInicial" value="#{documentoMacroMB.documentoMacro.anoiniciodocumento}" maxlength="4" required="true" requiredMessage="Campo ano inicial é obrigatório."/>
<p:outputLabel value="Ano Final" for="anoFinal"/>
<p:inputText id="anoFinal" value="#{documentoMacroMB.documentoMacro.anofimdocumento}" maxlength="4" required="true" requiredMessage="Campo ano final é obrigatorio."/>
</p:panelGrid>
<p:panelGrid columns="6" styleClass="semBorda">
<p:outputLabel value="Altura" for="altura"/>
<p:inputText id="altura" value="#{documentoMacroMB.documentoMacro.alturadocumento}" maxlength="6" required="true" requiredMessage="Campo altura é obrigatório."/>
<p:outputLabel value="Largura" for="largura"/>
<p:inputText id="largura" value="#{documentoMacroMB.documentoMacro.larguradocumento}" maxlength="6" required="true" requiredMessage="Campo largura é obrigatorio."/>
<p:outputLabel value="Profundidade" for="profundidade"/>
<p:inputText id="profundidade" value="#{documentoMacroMB.documentoMacro.profundidadedocumento}" maxlength="6" required="true" requiredMessage="Campo profundidade é obrigatório."/>
</p:panelGrid>
<p:panelGrid columns="4" styleClass="semBorda">
<p:outputLabel value="Tipo de Documento" for="tipoDocumento"/>
<p:selectOneMenu id="tipoDocumento" value="#{documentoMacroMB.descricaoTipoMacro}" style="width:125px">
<f:selectItem itemLabel="Selecione o tipo" itemValue="" />
<f:selectItems value="#{tipoDocumentoMacroMB.options}" />
</p:selectOneMenu>
<p:outputLabel value="Número de Páginas" for="numeroDePaginas"/>
<p:inputText id="numeroDePaginas" value="#{documentoMacroMB.documentoMacro.numerodepaginas}" maxlength="6" required="true" requiredMessage="Campo número de páginas é obrigatorio."/>
</p:panelGrid>
<p:panelGrid columns="2" class="semBorda">
<p:outputLabel value="Observações" for="observacoes"/>
<p:inputTextarea id="observacoes" value="#{documentoMacroMB.documentoMacro.observacoes}" style="width: 600px; min-height: 100px;"/>
</p:panelGrid>
<p:commandButton action="#{documentoMacroMB.salvar()}" value="Salvar" update=":tabDocMacro:tblDocMacro"
onclick="cadastroDocumentoMacro.hide()"/>
<p:messages/>
</h:form>
</p:dialog>
<p:dialog modal="true" height="500" width="900" widgetVar="exclusaoDocumentoMacro">
<h:form>
<p:commandButton value="Sim" action="#{documentoMacroMB.excluir()}" update=":tabDocMacro:tblDocMacro"
onclick="exclusaoDocumentoMacro.hide()" actionListener="#{documentoMacroMB.setDocumentoMacro(documentoMacro)}"/>
<p:commandButton value="Não" onclick="exclusaoDocumentoMacro.hide()"/>
</h:form>
</p:dialog>
</f:view>
</ui:define>
</ui:decorate>
Esse próximo é o Bean DocumentoMacroMB onde eu criei o método excluir.
package br.edu.ifba.dovicmaker.bean;
import br.edu.ifba.dovicmaker.dao.DocumentoMacroDAO;
import br.edu.ifba.dovicmaker.dao.TipoDocumentoMacroDAO;
import br.edu.ifba.dovicmaker.entidade.Documentomacro;
import br.edu.ifba.dovicmaker.entidade.Documentomicro;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
/**
* @author Sidney Ferraz
* Esta é uma classe que implementa o ManagenBean referente ao documento DocumentoMacro
* Ela é reponsável por por fazer a interface com o código xhtml
*/
@ManagedBean
@RequestScoped
public class DocumentoMacroMB {
private Integer idTipoMacro;
private String descricaoTipoMacro;
private Documentomacro documentoMacro;
private List<Documentomacro> lista;
private List<Documentomicro> listaMicro;
private Documentomacro selectedDocument;
private Documentomacro id;
public Documentomacro getId() {
return id;
}
public void setId(Documentomacro id) {
this.id = id;
}
public List<Documentomicro> getListaMicro() {
return listaMicro;
}
public void setListaMicro(List<Documentomicro> listaMicro) {
this.listaMicro = listaMicro;
}
public Documentomacro getDocumentoMacro() {
return documentoMacro;
}
public Documentomacro getSelectedDocument() {
return selectedDocument;
}
public void setSelectedDocument(Documentomacro selectedDocument) {
this.selectedDocument = selectedDocument;
}
public void setDocumentoMacro(Documentomacro documentoMacro) {
//System.out.println(documentoMacro.getTitulo());
this.documentoMacro = documentoMacro;
}
public List<Documentomacro> getLista() {
return lista;
}
public void setLista(List<Documentomacro> lista) {
this.lista = lista;
}
public Integer getIdTipoMacro() {
return idTipoMacro;
}
public void setIdTipoMacro(Integer idTipoMacro) {
this.idTipoMacro = idTipoMacro;
}
public String getDescricaoTipoMacro() {
return descricaoTipoMacro;
}
public void setDescricaoTipoMacro(String descricaoTipoMacro) {
this.descricaoTipoMacro = descricaoTipoMacro;
}
public void salvar(){
idPorDescricaoTipoMacro();
DocumentoMacroDAO dao = new DocumentoMacroDAO();
dao.salvar(documentoMacro);
inicializar();
}
public void excluir(){
DocumentoMacroDAO dao = new DocumentoMacroDAO();
dao.excluir(documentoMacro);
inicializar();
}
@PostConstruct
public void inicializar(){
documentoMacro = new Documentomacro();
DocumentoMacroDAO dao = new DocumentoMacroDAO();
lista = dao.listar();
}
public void idPorDescricaoTipoMacro(){
TipoDocumentoMacroDAO dao = new TipoDocumentoMacroDAO();
idTipoMacro = dao.localizarId(descricaoTipoMacro);
documentoMacro.setIdtipomacro(idTipoMacro);
}
public String cadastroDocumentoMacro(){
return "cadastroDocumentoMacro.xhtml";
}
public void showMessage() {
//String idTxt = Integer.toString(id);
//FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "iddocumentomacro", idTxt);
//PrimeFaces.current().dialog().showMessageDynamic(message);
}
public String listarDocumentoMicro(){
DocumentoMacroDAO dao = new DocumentoMacroDAO();
listaMicro = dao.listarDocumentoMicroPorId(documentoMacro);
FacesContext fCtx = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) fCtx.getExternalContext().getSession(true);
session.setAttribute("documentoMacro", documentoMacro);
return "documentoMicroLista.xhtml";
}
public void carregarDocumentoMacro(){
}
}
O próximo é o DAO DocumentoMacroDAO. Onde também existe o método excluir que faz a conexão e a exclusão do documento.
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package br.edu.ifba.dovicmaker.dao;
import br.edu.ifba.dovicmaker.entidade.Documentomacro;
import br.edu.ifba.dovicmaker.entidade.Documentomicro;
import br.edu.ifba.dovicmaker.util.HibernateUtil;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
/**
*
* @author ferra
*/
public class DocumentoMacroDAO {
/*public void salvar(Documentomacro documentomacro) {
Session sessao = HibernateUtil.getSessionFactory().openSession();
sessao.beginTransaction();
sessao.persist(documentomacro);
sessao.getTransaction().commit();
sessao.close();
}*/
public void salvar(Documentomacro documentomacro) {
//Integer idDocumentoMacro = null;
Documentomacro documentoMacro = null;
try {
Session sessao = HibernateUtil.getSessionFactory().openSession();
Criteria crit = sessao.createCriteria(Documentomacro.class);
crit.add(Restrictions.eq("iddocumentomacro", documentomacro.getIddocumentomacro()));
documentoMacro = (Documentomacro) crit.uniqueResult();
System.out.println("passou por aqui");
if (documentoMacro == null) {
sessao.beginTransaction();
sessao.persist(documentomacro);
sessao.getTransaction().commit();
sessao.close();
} else {
sessao.beginTransaction();
sessao.merge(documentomacro);
sessao.getTransaction().commit();
sessao.close();
}
} catch (HibernateException e) {
}
}
public List<Documentomacro> listar() {
Session sessao = HibernateUtil.getSessionFactory().openSession();
List<Documentomacro> lista = sessao.getNamedQuery("Documentomacro.findAll").list();
sessao.close();
return lista;
}
public List<Documentomicro> listarDocumentoMicroPorId(Documentomacro documentoMacro) {
List<Documentomicro> lista = null;
try {
Session sessao = HibernateUtil.getSessionFactory().openSession();
Criteria crit = sessao.createCriteria(Documentomicro.class);
//crit.createAlias("iddocumentomacro", "idMacro");
//crit.add(Restrictions.eq("idMacro.iddocumentomacro", id));
crit.add(Restrictions.eq("iddocumentomacro", documentoMacro));
lista = crit.list();
sessao.close();
} catch (HibernateException e) {
}
return lista;
}
/*public List<Documentomicro> listarDocumentoMicroPorIdMacro(Integer id){
Session sessao = HibernateUtil.getSessionFactory().openSession();
List<Documentomicro> lista = sessao.getNamedQuery("Documentomicro.findByIddocumentomacro").setParameter("iddocumentomacro", id).list();
sessao.close();
return lista;
}*/
public void excluir(Documentomacro documentomacro) {
System.out.println("O ID do documento é "+documentomacro.getIddocumentomacro());
Session sessao = HibernateUtil.getSessionFactory().openSession();
sessao.beginTransaction();
sessao.delete(documentomacro);
sessao.getTransaction().commit();
sessao.close();
}
}
OBS: lembrando que:
System.out.println("O ID do documento é "+documentomacro.getIddocumentomacro());
É apenas um teste para saber se o objeto documentomacro veio com o parametro.
Esse é o erro que lança:
HTTP Status 500 - java.lang.NullPointerException
type Exception report
message java.lang.NullPointerException
description The server encountered an internal error that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: java.lang.NullPointerException
javax.faces.webapp.FacesServlet.service(FacesServlet.java:659)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause
javax.faces.el.EvaluationException: java.lang.NullPointerException
javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:101)
com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
org.primefaces.application.DialogActionListener.processAction(DialogActionListener.java:46)
javax.faces.component.UICommand.broadcast(UICommand.java:315)
javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause
java.lang.NullPointerException
br.edu.ifba.dovicmaker.dao.DocumentoMacroDAO.excluir(DocumentoMacroDAO.java:86)
br.edu.ifba.dovicmaker.bean.DocumentoMacroMB.excluir(DocumentoMacroMB.java:96)
sun.reflect.GeneratedMethodAccessor3367.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
org.apache.el.parser.AstValue.invoke(AstValue.java:279)
org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:273)
com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
org.primefaces.application.DialogActionListener.processAction(DialogActionListener.java:46)
javax.faces.component.UICommand.broadcast(UICommand.java:315)
javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.79 logs.
Obrigado aí Mike. Pode ser que agora fica mais fácil fazer uma análise.