单击CommandLink后未填充Primefaces对话框字段

单击CommandLink后未填充Primefaces对话框字段,primefaces,dialog,Primefaces,Dialog,我将Primefaces 3.5与Weblogic 11配合使用。我有一个页面,其中有一个对话框,用于编辑从两个位置调用的“profile”实体(“perfil”)。首先从commandButton插入新的配置文件。从数据表中选择第二个来编辑特定概要文件。下面,我将显示代码: XHTML页面的片段 我有什么问题?显然,当我想插入一个新的配置文件时,一切似乎都正常。但是,当我单击编辑现有配置文件以打开对话框时,尽管输出文本和选取列表已正确填充,但输入文本和选择菜单未正确填充 在寻找解决方案时,我

我将Primefaces 3.5与Weblogic 11配合使用。我有一个页面,其中有一个对话框,用于编辑从两个位置调用的“profile”实体(“perfil”)。首先从commandButton插入新的配置文件。从数据表中选择第二个来编辑特定概要文件。下面,我将显示代码:

XHTML页面的片段

我有什么问题?显然,当我想插入一个新的配置文件时,一切似乎都正常。但是,当我单击编辑现有配置文件以打开对话框时,尽管
输出文本
选取列表
已正确填充,但
输入文本
选择菜单
未正确填充

在寻找解决方案时,我发现了一个建议,建议在对话框中使用
appendToBody=“true”
。当我尝试时,
inputText
selectOneMenu
已正确填充。但是,验证没有按预期进行。当我单击保存时,会显示一条消息,指示选择列表未填充,即使它确实已填充。实际上,即使没有填写
inputText
,也没有关于这些
inputText
的消息,尽管它们是必需的

另一种选择是在
命令链接中使用

<!-- 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>
现在,当我单击创建一个新的perfil时,尽管在actionListener方法中perfil属性已填充,但在渲染对话框时,我得到了一个NullPointerException。这就像打开对话框后,第一个被称为
perfilAcessoMB.setPerfil()
,最后是actionListener方法。另一方面,如果我单击以编辑一个现有的概要文件,我将返回到初始情况

因此,我迷路了,不知道如何解决这个问题

谢谢


拉斐尔·阿方索(Rafael Afonso)

解决方案非常简单:只是在两个命令按钮中添加了
process=“@this”

<!-- 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>

public class PerfilAcessoORM  {

    private Long id;

    private String nome;

    private String descricao;

    private Boolean situacao = null;

    private List<FuncaoORM> funcoes;

    // Getters & Setters

}
public class FuncaoORM {

    private Long id;

    public String descricao;

    // Getters & Setters

}
<!-- 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>
public void abrirDialogoEdicao() {
    if(this.perfil == null) {
        this.perfil = new PerfilAcessoORM();
    }
    System.out.println("PerfilAcessoMB.onAbrirDialogoEdicao(): "
            + this.perfil);
    // The rest remains the same ...
}
<!-- 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>