PhaseListener + PrimeFaces dataTable Dialog

0 respostas
shikimaru

Olá pessoal,

Eu procurei em diversos lugares não sei meu método de pesquisa está errado ou não mas não achei nada que cite isto ou porque disto estar acontecendo.

Eu tenho uma aplicação com o PhaseListener verificando a autenticação do usuário, até ai funciona perfeitamente, mas ai vem o problema.

Eu tenho uma dataTable que possui view:dialog de primefaces, que deveria pegar o valor da linha selecionada e mostrar na tela, porém ele sempre mostra nulo, e sem nenhum erro.

Então eu descobri o que está acontecendo, porém não sei ainda como arrumar.

Quando eu faço a autenticação eu crio através do phaseListener um atributo com meu usuário, quando eu clico no botão view dialog, ele vai para o afterPhase e faz 2 vezes a passagem, na primeira ele valida o usuário, porém só abriu o dialogbox na tela, na segunda quando ele deve atualizar o valor das variáves através do @ManagedBean meu atributo vem zerado e o ajax redireciona para tela de login, o que me retorna os valores nulos.

Segue os códigos:

PhaseListener
import javax.faces.application.NavigationHandler;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.http.HttpSession;

public class AuthorizationListener implements PhaseListener {

  @Override
  public void afterPhase(PhaseEvent event) {    
    
    FacesContext facesContext = event.getFacesContext();
    String currentPage = facesContext.getViewRoot().getViewId();
    
    boolean isLoginPage = (currentPage.lastIndexOf("index.xhtml") == 1);
    HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);
    Object currentUser = session.getAttribute("usuarioLogado");

    System.out.println(DateTime.now().toString());
    System.out.println( currentUser != null ? currentUser.toString() : "Null");

    if (!isLoginPage && currentUser == null) {
      System.out.print("Redirecionando, sem permissão");
      NavigationHandler nh = facesContext.getApplication().getNavigationHandler();
      nh.handleNavigation(facesContext, null, "/index.xhtml");
    }
  }

  @Override
  public void beforePhase(PhaseEvent event) {
            
  }

  @Override
  public PhaseId getPhaseId() {
    return PhaseId.RESTORE_VIEW;
  }
}
EmpresaBean
import br.com.magicorp.magi.business.EmpresaBusiness;
import br.com.magicorp.magi.framework.InterfaceBean;
import br.com.magicorp.magi.model.Empresa;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;
import org.joda.time.DateTime;

@ManagedBean
@SessionScoped
public class EmpresaBean implements InterfaceBean {

  private Empresa empresa = new Empresa();
  private Empresa selectedEmpresa;
  private List<Empresa> listaEmpresa;

  @PostConstruct
  @Override
  public void doList() {
    EmpresaBusiness bll = new EmpresaBusiness();
    listaEmpresa = bll.doSelectAll();
  }

  @Override
  public String doUpdate() {
    this.empresa = this.selectedEmpresa;
    return "form.xhtml?faces-redirect=true";
  }

  @Override
  public String doSave() {
    return "";
  }

  @Override
  public String doNew() {
    return "";
  }

  /**
   * Getters && Setters *
   */
  public Empresa getEmpresa() {
    return empresa;
  }

  public void setEmpresa(Empresa empresa) {
    this.empresa = empresa;
  }

  public List<Empresa> getListaEmpresa() {
    return listaEmpresa;
  }

  public void setListaEmpresa(List<Empresa> listaEmpresa) {
    this.listaEmpresa = listaEmpresa;
  }

  public Empresa getSelectedEmpresa() {
      return empresa;
  }

  public void setSelectedEmpresa(Empresa selectedEmpresa) {
    this.selectedEmpresa = selectedEmpresa;
  }
Formulário
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets" template="#{root}/template/layout.xhtml"
                  xmlns="http://www.w3.org/1999/xhtml"
                  xmlns:f ="http://java.sun.com/jsf/core"
                  xmlns:h ="http://java.sun.com/jsf/html"
                  xmlns:p="http://primefaces.org/ui">
  <ui:define name="conteudo" id="conteudoInterno">
    <h1>Empresa</h1>
    <h:form id="form" prependId="false" >       
    <p:dataTable id="tabela" value="#{empresaBean.listaEmpresa}" var="e">  

      <p:column id="cnpjs">
        <h:outputText value="#{e.cnpj}" id="cnpj">
          <f:converter converterId="CNPJConverter"/>
        </h:outputText>
      </p:column>

      <p:column style="width:40px" id="acoes">  
        <p:commandButton process="@this" id="selectButton" update=":form:atu" icon="ui-icon-search" oncomplete="dialog.show()"  title="View"  >  
          <f:setPropertyActionListener value="#{e}" target="#{empresaBean.selectedEmpresa}" />  
        </p:commandButton>  
      </p:column>  
    </p:dataTable> 
    <p:dialog header="Informações da Empresa" 
              widgetVar="dialog" resizable="false" id="dialogg"  
              showEffect="fade" hideEffect="explode" modal="true" appendToBody="true ">  
      <h:panelGrid id="display" columns="2" cellpadding="4" style="margin:0 auto;"> 
        <h:outputText value=" asdf #{empresaBean.selectedEmpresa}" id="atu"/>       
      </h:panelGrid>
    </p:dialog>    
  </h:form>
  </ui:define>
</ui:composition>
Layout
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transational//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transational.dtd">
<html xmlns="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.org/ui">
  <f:view contentType="text/html"></f:view>
  <ui:param name="root" value="#{request.requestURL.substring(0, request.requestURL.length() - request.requestURI.length())}#{request.contextPath}"/>
  <h:head>
    <title>FG/SAMDE - Feixe Gerencial- Sistema Analítico de Monitoramento de Dados e Equipamentos</title>
    <link href="#{root}/css/reset.css" rel="stylesheet" type="text/css" /> 
    <link href="#{root}/css/text.css" rel="stylesheet" type="text/css" /> 
    <link href="#{root}/css/960.css" rel="stylesheet" type="text/css" />    
    <link href="#{root}/css/style.css" rel="stylesheet" type="text/css" /> 
  </h:head>
  <h:body styleClass="container_24 alpha omega" id="body">    
    <div class="grid_24">
      <ui:include src="menu.xhtml"></ui:include> 
    </div>
    <div>
      <div class="grid_24">
        <div class="grid_24">
          <p:messages id="messages" showDetail="true" autoUpdate="true"/>  
        </div>
        <div id="content" class="grid_24">
          <ui:insert name="conteudo">
            <br />Vai ser substituido...
          </ui:insert>
        </div>
      </div>
    </div>    
  </h:body>
</html>

UPDATE: Só para facilitar peguei o trace de quando clica no botão efetuado por System.out.println() no afterPhase(), lembrando que 1 clique ocasiona nas duas passadas no afterPhases, e o que me retorna nulo.

Saida do GlassFIsh

Informações: 2012-06-21T00:27:38.645-03:00
Informações: Usuario{id=1, usuario=hugo.magicorp, algorithm=sha1, salt=62f9e6f464789c36994a24ab1d66b2d7, password=653450e76de2b6477d04d0962e845804d9edb7b3, criado_em=2012-06-16T11:45:22.000-03:00, last_login=2012-06-21T00:26:42.267-03:00, esta_ativo=true, e_super_admin=true, empresa=Empresa{cnpj=15676006000150, razao_social=null, nome_fantasia=null, inscricao_estadual=null, inscricao_municipal=null, web=null, telefone_comercial=null, telefone_operacional=null, telefone_fax=null, memorando=null, status=false, responsavel=null, criado_em=null, atualizado_em=null, cep=null, endereco=null, numero=null, complemento=null, bairro=null, cidade=null, estado=null, pais=null}, grupos=[], permissoes=[]}
Informações: Salvei: 2012-06-21T00:27:38.653-03:00

Informações: 2012-06-21T00:27:38.662-03:00
Informações: Null
Informações: Redirecionando, sem permissão
Advertência: Definindo valor de atributo não serializável em ViewMap (chave: usuarioLoginBean, classe do valor: br.com.magicorp.magi.bean.UsuarioLoginBean).

Saida do Firebug
<?xml version='1.0' encoding='UTF-8'?>
<partial-response><changes><update id="javax.faces.ViewState"><![CDATA[-2339505310235051487:-9113381215211024051]]></update></changes></partial-response>
Criado 20 de junho de 2012
Respostas 0
Participantes 1