2014-04-10 73 views
1

我使用Primefaces 3.5與Weblogic 11.我有一個頁面,其中一個對話框來編輯從兩個地方調用'輪廓'實體('perfil'葡萄牙語)。首先從commandButton中插入一個新的配置文件。第二個來自dataTable來編輯特定的配置文件。下面,我展示的代碼:Primefaces對話框字段沒有填充後點擊CommandLink

片段XHTML頁面

<p:fieldset legend="Pesquisa de Perfil"> 
    <p:panelGrid columns="2"> 
     <f:facet name="footer"> 
      <p:commandButton id="btnPesquisar" 
       actionListener="#{perfilAcessoMB.pesquisar}" value="Pesquisar" 
       immediate="true" update="pnlPerfis" styleClass="ui-icon-search" /> 
      <p:spacer width="20"></p:spacer> 
      <!-- OPEN DIALOG TO CREATE A NEW PROFILE --> 
      <p:commandButton id="btnIncluir" value="Incluir" 
       update="dlgPerfil" immediate="true" 
       actionListener="#{perfilAcessoMB.abrirDialogoEdicao(null)}" 
       oncomplete="dlgPerfil.show();"> 
      </p:commandButton> 
     </f:facet> 
    </p:panelGrid> 
</p:fieldset> 

<br /> 

<p:outputPanel id="pnlPerfis" layout="block"> 
    <p:fieldset id="resultadoPesquisa" legend="Resultado da Pesquisa" 
     rendered="#{not empty perfilAcessoMB.perfis}"> 
     <p:dataTable id="tblPerfis" value="#{perfilAcessoMB.perfis}" 
      var="perfil" emptyMessage="Nenhum perfil encontrado."> 
      <p:column headerText="Nome do Perfil"> 
       <h:outputText value="#{perfil.nome}"></h:outputText> 
      </p:column> 
      <p:column headerText="Descrição do Perfil"> 
       <h:outputText value="#{perfil.descricao}"></h:outputText> 
      </p:column> 
      <p:column headerText="Situação do Perfil" 
       style="text-align: center; width: 100px;"> 
       <h:outputText value="Ativo" rendered="#{perfil.situacao}" /> 
       <h:outputText value="Inativo" rendered="#{not perfil.situacao}" /> 
      </p:column> 
      <p:column headerText="Editar" 
       style="text-align: center; width: 50px;"> 
       <!-- OPEN DIALOG TO EDIT A NEW PROFILE --> 
       <p:commandLink id="lnkEditar" immediate="true" 
        title="Editar Perfil" update=":formPrincipal:dlgPerfil :formPrincipal:pnlPerfilEdicao" 
        actionListener="#{perfilAcessoMB.abrirDialogoEdicao(perfil)}" 
        oncomplete="dlgPerfil.show();"> 
        <h:outputText value="Editar" /> 
       </p:commandLink> 
      </p:column> 
      <p:column headerText="Excluir" 
       style="text-align: center; width: 50px;"> 
      </p:column> 
     </p:dataTable> 
    </p:fieldset> 

</p:outputPanel> 

<p:dialog id="dlgPerfil" widgetVar="dlgPerfil" resizable="false" 
    closable="true" modal="true" closeOnEscape="true" 
    header="#{(empty perfilAcessoMB.perfil)? 'Incluir': 'Editar'} Perfil"> 
    <h:outputText value="#{perfilAcessoMB.perfil}"></h:outputText> 
    <h:panelGroup id="pnlPerfilEdicao" layout="block"> 
     <p:fieldset legend="Dados do Perfil"> 
      <p:panelGrid columns="2"> 
       <h:outputLabel id="lblNomePerfilEdicao" value="Nome do Perfil" 
        for="txtNomePerfilEdicao" /> 
       <p:inputText id="txtNomePerfilEdicao" required="true" 
        requiredMessage="É obrigatório preencher o campo Nome do Perfil." 
        value="#{perfilAcessoMB.perfil.nome}" maxlength="20" size="20"></p:inputText> 

       <h:outputLabel id="lblDescricaoPerfilEdicao" 
        value="Descrição do Perfil" for="txtDescricaoPerfilEdicao" /> 
       <p:inputText id="txtDescricaoPerfilEdicao" required="true" 
        requiredMessage="É obrigatório preencher o campo Descrição do Perfil." 
        value="#{perfilAcessoMB.perfil.descricao}" maxlength="20" 
        size="20"></p:inputText> 

       <h:outputLabel id="lblSituacaoPerfilEdicao" value="Situação" 
        for="selSituacaoPerfilEdicao" /> 
       <p:selectOneMenu id="selSituacaoPerfilEdicao" 
        value="#{perfilAcessoMB.perfil.situacao}"> 
        <f:selectItems value="#{perfilAcessoMB.situacoesEdicao}" /> 
       </p:selectOneMenu> 
      </p:panelGrid> 
     </p:fieldset> 
     <br /> 
     <p:fieldset legend="Permissões"> 
      <p:pickList id="pickFuncoes" value="#{perfilAcessoMB.funcoes}" 
       var="funcao" itemValue="#{funcao}" 
       itemLabel="#{funcao.descricao}" required="true" 
       requiredMessage="É obrigatório associar ao menos uma funcionalidade ao perfil." 
       converter="funcaoConverter" /> 
      <p:column>#{funcao.descricao}</p:column> 
     </p:fieldset> 
     <p:panelGrid columns="2"> 
      <p:commandButton id="btnSalvarPerfil" value="Salvar" 
       actionListener="#{perfilAcessoMB.salvar}" 
       oncomplete="if(args &amp;&amp; !args.validationFailed) dlgPerfil.hide();" /> 
      <p:commandButton id="btnCancelarPerfil" value="Cancelar" 
       immediate="true" onclick="dlgPerfil.hide();" /> 
     </p:panelGrid> 
    </h:panelGroup> 
</p:dialog> 

MangedBean(perfilAcessoMB)

@ManagedBean 
@ViewScoped 
public class PerfilAcessoMB extends BaseMB { 

    private PerfilAcessoORM perfil; 

    private List<PerfilAcessoORM> perfis; 

    private String nomePerfil; 

    private Boolean situacao; 

    private DualListModel<FuncaoORM> funcoes; 

    private SelectItem[] situacoesPesquisa = new SelectItem[] { 
      new SelectItem(null, "Todos"), SELECT_ITEM_ATIVO, 
      SELECT_ITEM_INATIVO }; 

    private SelectItem[] situacoesEdicao = new SelectItem[] { 
      SELECT_ITEM_ATIVO, SELECT_ITEM_INATIVO }; 

    private FuncaoORM funcaoA = new FuncaoORM(1L, "FUNÇÃO A"), // 
      funcaoB = new FuncaoORM(2L, "B Function"), // 
      funcaoC = new FuncaoORM(10L, "Se Funssaum"); 

    public void abrirDialogoEdicao(PerfilAcessoORM p) { 
     this.perfil = (p == null)? new PerfilAcessoORM(): p; 
     System.out.println("PerfilAcessoMB.onAbrirDialogoEdicao(): " 
       + this.perfil); 

     List<FuncaoORM> funcoesDisponiveis = new ArrayList<FuncaoORM>(
       Arrays.asList(funcaoA, funcaoB, funcaoC)); 
     // Remove from funcoesDisponiveis those whose are present in perfil. 
     if (this.perfil.getFuncoes() == null) { 
      this.funcoes = new DualListModel<FuncaoORM>(funcoesDisponiveis, 
        Lists.<FuncaoORM> newArrayList()); 
     } else { 
      funcoesDisponiveis.removeAll(this.perfil.getFuncoes()); 
      this.funcoes = new DualListModel<FuncaoORM>(funcoesDisponiveis, 
        this.perfil.getFuncoes()); 
     } 
    } 

    // Getters & Setters 

} 

PerfilAcessoORM(配置文件)實體

public class PerfilAcessoORM { 

    private Long id; 

    private String nome; 

    private String descricao; 

    private Boolean situacao = null; 

    private List<FuncaoORM> funcoes; 

    // Getters & Setters 

} 

FuncaoORM實體:

​​

我的問題是什麼?顯然,當我想插入一個新的配置文件,一切似乎都沒問題。但是,當我單擊編輯現有配置文件以打開對話框時,雖然outputTextpickList已正確填充,但inputTextselectOneMenu不是。

尋找解決方案,我發現here建議在對話框中使用appendToBody="true"。當我嘗試時,inputTextselectOneMenu正確填充。但是,驗證不能等待。當我點擊保存時,會顯示一條消息,指出pickList沒有填充,即使它真的被填滿。實際上,即使inputText沒有填寫,也沒有關於這些inputText的消息,儘管它們是必需的。

另一種方法是使用<f:setPropertyActionListener>commandLink

<!-- OPEN DIALOG TO CREATE A NEW PROFILE --> 
<p:commandButton id="btnIncluir" value="Incluir" 
    update="dlgPerfil" immediate="true" 
    actionListener="#{perfilAcessoMB.abrirDialogoEdicao}" 
    oncomplete="dlgPerfil.show();"> 
    <f:setPropertyActionListener target="#{perfilAcessoMB.perfil}" value="#{null}"/> 
</p:commandButton> 


<!-- OPEN DIALOG TO EDIT A NEW PROFILE --> 
<p:commandLink id="lnkEditar" immediate="true" 
    title="Editar Perfil" update=":formPrincipal:dlgPerfil :formPrincipal:pnlPerfilEdicao" 
    actionListener="#{perfilAcessoMB.abrirDialogoEdicao}" 
    oncomplete="dlgPerfil.show();"> 
    <f:setPropertyActionListener target="#{perfilAcessoMB.perfil}" value="#{perfil}"/> 
    <h:outputText value="Editar" /> 
</p:commandLink> 

的ActionListener的方法將變更爲:

​​

現在,當我點擊創建一個新的PERFIL,雖然ActionListener的方法perfil屬性被填充,當對話框被渲染時,我得到了一個N​​ullPointerException。它首先被稱爲perfilAcessoMB.setPerfil(),打開對話框後最後是actionListener方法。另一方面,如果我點擊編輯現有的配置文件,我會回到初始狀態。

因此,我迷路了,不知道該如何解決這個問題。

感謝,

拉斐爾·阿豐索

回答

1

的解決方案是令人難以置信的簡單:只需添加process="@this"到兩個CommandButton控件。

<!-- OPEN DIALOG TO EDIT A NEW PROFILE --> 
<p:commandLink id="lnkEditar" immediate="true" 
    title="#{msg['titulo.edicao']}" process="@this" 
    update=":formPrincipal:dlgPerfil" 
    actionListener="#{perfilAcessoMB.abrirDialogoEdicao(perfil)}" 
    oncomplete="dlgPerfil.show();"> 
    <h:outputText value="#{msg['titulo.edicao']}" /> 
</p:commandLink> 
+0

請記住將自己的答案標記爲已接受的答案(✓),如果它適合您。 –