Dialog não permite o uso de outro controle

Bom dia,

A configuração do projeto: Primefaces 5.0, JSF 2.2 e JPA 2.1.

Tenho o CRUD cidade. Quando executo o CREATE de cidade, permito ao meu usuário a inserção de novos estados de outros países, juntamente com sua sigla, certo. Estou com o seguinte problema: Quando clico no botão Novo Estado’ o mesmo abre o componente dialog, mas não apresenta os campos.

Algumas soluções utilizadas sem sucesso:

  • Retirar o botão ‘Novo Estado’ de dentro do componente PainelGrid na qual se realiza o rendered do Dialog ‘Nova Cidade’.
  • Retirar o rendered do componente PainelGrid do componente Dialog ‘Novo Estado’.

Dialog “Novo Cidade”:

[code]<p:dialog id=“CidadeCreateDlg” widgetVar=“CidadeCreateDialog” closeOnEscape=“true” modal=“true” appendTo="@(body)" header="#{bundle.titleDialogNew} #{bundle.cityText}">
<f:view>
<h:form id=“CidadeCreateForm”>
<h:panelGroup id=“display”>

                    <p:messages id="mensagens" showDetail="true" autoUpdate="true" closable="true"/>
                    <h:outputText value="* campo obrigatório."/>
                    <p:panelGrid rendered="#{cidadeControle.selecionado != null}">
                        <p:row>
                            <p:column>
                                <p:outputLabel value="#{bundle.countryText}" for="cmbPais"/>
                            </p:column>
                            <p:column colspan="2">
                                <p:selectOneMenu id="cmbPais"
                                                 required="true">
                                    <f:selectItem itemLabel="#{bundle.comboboxSelectText}" itemValue=""/>
                                    <f:selectItems value="#{paisControle.itens}"
                                           var="country"
                                           itemLabel="#{country.pais}"
                                           itemValue="#{country}"/>
                                </p:selectOneMenu>
                                <p:message for="cmbPais"/>
                            </p:column>
                        </p:row>
                        <p:row>
                            <p:column>
                                <p:outputLabel value="#{bundle.stateText}" for="cmbEstado"/>
                            </p:column>
                            <p:column>
                                <p:selectOneMenu id="cmbEstado" 
                                         value="#{cidadeControle.selecionado.codigoEstado}"
                                         required="true"
                                         requiredMessage="#{bundle.stateText}: #{bundle.errorMessageValidationField}">
                                    <f:selectItem itemLabel="#{bundle.comboboxSelectText}" itemValue=""/>
                                    <f:selectItems value="#{estadoControle.itens}"
                                           var="state"
                                           itemLabel="#{state.estado}"
                                           itemValue="#{state}"/>
                                </p:selectOneMenu>
                            </p:column>
                            <p:column>
                                <p:commandButton id="#{bundle.buttonNameNew}" title="#{bundle.buttonTitleNew} #{bundle.stateText}"    icon="ui-icon-plus" update=":EstadoCreateForm" oncomplete="PF('EstadoCreateDialog').show();" actionListener="#{estadoControle.prepararCriar}"/>
                            </p:column>
                        </p:row>
                        <p:row>
                            <p:column>
                                <p:outputLabel value="CEP" for="txtCep"/> 
                            </p:column>
                            <p:column colspan="2">
                                <p:inputMask id="txtCep" mask="99.999-999" value="#{cidadeControle.selecionado.cep}" title="#{bundle.cityTextPostalCode}" required="true"/>
                            </p:column>
                        </p:row>
                        <p:row>
                            <p:column>
                                <p:outputLabel value="#{bundle.cityText}" for="txtCidade"/>
                            </p:column>
                            <p:column colspan="2">
                                <p:inputText id="txtCidade" value="#{cidadeControle.selecionado.cidade}" title="#{bundle.cityText}"  required="true" requiredMessage="#{bundle.cityText}: #{bundle.errorMessageValidationField}"/>
                            </p:column>
                        </p:row>
                        <p:row>
                            <p:column>
                                <p:outputLabel value="#{bundle.cityTextCitizenship}" for="txtNaturalidade"/>
                            </p:column>
                            <p:column colspan="2">
                                <p:inputText id="txtNaturalidade" value="#{cidadeControle.selecionado.naturalidade}" title="#{bundle.cityTextCitizenship}" required="true"/>
                            </p:column>
                        </p:row>
                    </p:panelGrid>
                    <p:commandButton id="#{bundle.buttonNameSave}" value="#{bundle.buttonTitleSave}" icon="ui-icon-disk" actionListener="#{cidadeControle.criar}" update="display,:CidadeListForm:datalist" oncomplete="handleSubmit(args,'CidadeCreateDialog')"/>
                    <p:commandButton id="#{bundle.buttonNameCancel}" value="#{bundle.buttonTitleCancel}" icon="ui-icon-cancel" actionListener="#{cidadeControle.cancelar}" oncomplete="PF('CidadeCreateDialog').hide();"/>
                </h:panelGroup>
            </h:form>
        </f:view>
    </p:dialog>[/code]

Na Linha 42 se encontra o botão, na qual abre-se o dialog abaixo.

Dialog “Novo Estado”:

<p:dialog id="EstadoCreateDlg" widgetVar="EstadoCreateDialog" closeOnEscape="true" modal="true" appendTo="@(body)" header="#{bundle.titleDialogNew} #{bundle.stateText}"> <f:view> <h:form id="EstadoCreateForm"> <h:panelGroup id="display"> <p:messages for="mensagens"/> <h:outputText value="* campo obrigatório."/> <p:panelGrid columns="2" rendered="#{estadoControle.selecionado!=null}"> <p:outputLabel value="#{bundle.countryText}" for="cmbPais"/> <p:selectOneMenu id="cmbPais" value="#{estadoControle.selecionado.codigoPais}" required="true" requiredMessage="#{bundle.countryText}: #{bundle.errorMessageValidationField}"> <f:selectItem itemLabel="#{bundle.comboboxSelectText}" itemValue=""/> <f:selectItems value="#{paisControle.itens}" var="country" itemLabel="#{country.pais}" itemValue="#{country}"/> </p:selectOneMenu> <p:outputLabel value="#{bundle.stateText}" for="txtEstado"/> <p:inputText id="txtEstado" value="#{estadoControle.selecionado.estado}" title="#{bundle.stateText}" required="true" requiredMessage="#{bundle.cityTextCitizenship}: #{bundle.errorMessageValidationField}"/> <p:outputLabel value="#{bundle.stateTextUF}" for="txtUF"/> <p:inputMask mask="aa" id="txtUF" value="#{estadoControle.selecionado.uf}" title="#{bundle.stateTextUF}" required="true" requiredMessage="#{bundle.cityTextCitizenship}: #{bundle.errorMessageValidationField}"/> </p:panelGrid> <p:commandButton id="#{bundle.buttonNameSave}" value="#{bundle.buttonTitleSave}" icon="ui-icon-disk" actionListener="#{estadoControle.criar()}" update=":growl,:CidadeCreateForm:cmbEstado" oncomplete="handleSubmit(args,'EstadoCreateDialog')"/> <p:commandButton id="#{bundle.buttonNameCancel}" value="#{bundle.buttonTitleCancel}" icon="ui-icon-cancel" actionListener="#{estadoControle.cancelar}" oncomplete="PF('EstadoCreateDialog').hide();"/> </h:panelGroup> </h:form> </f:view> </p:dialog>

Já tentou colocar o form antes do dialog?

Sim. Já foi tentado em outras soluções sem sucesso. Tenho uma leve impressão de que o objeto do controle estado, está retonando null ou nem está sendo instanciado, pois, está dentro do rendered do PainelGrid do Dialog “Novo Estado” na linha 7. Vou postar aqui o controle cidade.

[code]@ManagedBean
@ViewScoped
public class CidadeControle extends AbstractControle implements Serializable{

/**
*Ocultado
*/

/**
 * Atributo recebe o cidade selecionada
 * @see #selecionado
 */
private Cidade selecionado;

public CidadeControle() {
    
}

public Cidade getSelecionado() {
    return selecionado;
}

public void setSelecionado(Cidade selecionado) {
    this.selecionado = selecionado;

}

/*

  • Métodos ocultados.
    */
    }[/code]

Controle Estado:

[code]@ManagedBean
@ViewScoped
public class EstadoControle extends AbstractControle implements Serializable{

/**
*código ocultado
*/

/**
 * Atributo recebe o estado selecionada
 * @see #selecionado
 */
private Estado selecionado;

public EstadoControle() {
}

/**
 * Método retorna o objeta da entity.
 * @return Estado Entity
 */
public Estado getSelecionado() {
    return selecionado;
}

public void setSelecionado(Estado selecionado) {
    this.selecionado = selecionado;
}

/**

  • Métodos ocultados
    */
    }
    [/code]

Será que é isso?

E a sua classe Bean?

São essas!

Está um pouco confuso o que vc ta mostrando(pelo menos pra mim rs), mostra esse bean todo jovem!

por exemplo

value="#{cidadeControle.selecionado.codigoEstado}"

cidadeControle é o Bean, selecionado é o objeto, esse objeto tem que vir preenchido(nem que seja tudo nulo), se o que tem no teu Bean é isso, não tem nada instanciando esse objeto…

[quote=Eiro]Está um pouco confuso o que vc ta mostrando(pelo menos pra mim rs), mostra esse bean todo jovem!

por exemplo

value="#{cidadeControle.selecionado.codigoEstado}"

cidadeControle é o Bean, selecionado é o objeto, esse objeto tem que vir preenchido(nem que seja tudo nulo), se o que tem no teu Bean é isso, não tem nada instanciando esse objeto…[/quote]

Desculpa ai, abaixo os beans completos

[code]@ManagedBean
@ViewScoped
public class EstadoControle extends AbstractControle implements Serializable{
/**
* Atributo recebe o EJB EstadoFacade
* @see #facade
*/
@EJB
private EstadoFacade facade;

/**
 * Atributo recebe a lista de relações
 * @see #itens
 */
private List<Estado> itens = null;

/**
 * Atributo recebe o estado selecionada
 * @see #selecionado
 */
private Estado selecionado;

public EstadoControle() {
}

/**
 * Método retorna o objeta da entity.
 * @return Estado Entity
 */
public Estado getSelecionado() {
    return selecionado;
}

public void setSelecionado(Estado selecionado) {
    this.selecionado = selecionado;
}

protected void setChavesIncoporaveis(){
    
}

protected void inicializarChaveIncorporavel(){
    
}

public EstadoFacade getFacade() {
    return facade;
}

public Estado prepararCriar(){
    selecionado = new Estado();
    inicializarChaveIncorporavel();
    return selecionado;
}

public void criar(){
    persistir(PersistirAcao.CRIAR, getMensagemAgrupada("sucessMessageCreate"));
    if (!ehFalhaValidacao()) {
        itens = null; //Invalida a lista de itens e evita a re-query.
    }
}

public void alterar(){
    persistir(PersistirAcao.ATUALIZAR, getMensagemAgrupada("sucessMessageChange"));
}

public void destruir(){
    persistir(PersistirAcao.EXCLUIR, getMensagemAgrupada("sucessMessageDelete"));
    if (!ehFalhaValidacao()) {
        selecionado = null; //Remove a seleção
        itens = null; //Invalida a lista de itens e evita a re-query.
    }
}

public void cancelar(){
    selecionado = null;
}

public Estado getEstado(Long id){
    return getFacade().encontrar(id);
}

public List<Estado> getItens(){
    if (itens == null) {
        itens = getFacade().encontrarTudo();
    }
    return itens;
}

public List<Estado> getSelecionarMuitosItensDisponiveis(){
    return getFacade().encontrarTudo();
}

public List<Estado> getSelecionarUmItensDisponiveis(){
    return getFacade().encontrarTudo();
}

private void persistir(PersistirAcao persistirAcao, String mensagemSucesso){
    if (selecionado != null) {
        setChavesIncoporaveis();
        try{
            if (persistirAcao != PersistirAcao.EXCLUIR) {
                getFacade().alterar(selecionado);
            }else{
                getFacade().excluir(selecionado);
            }
            adicionarMensagemSucesso(mensagemSucesso);
        }catch(EJBException excecao){
            String mensagem = "";
            Throwable causa = excecao.getCause();
            if (causa == null) {
                mensagem = causa.getLocalizedMessage();
            }
            if (mensagem.length() > 0) {
                adicionarMensagemErro(mensagem);
            } else {
                adicionarMensagemErro(excecao, getMensagemAgrupada("errorMessagePersistence"));                    
            }
        }catch(PersistenceException pe){
            //if(pe.getMessage().contains("ConstraintViolationException"))
                                adicionarMensagemErro(pe, pe.getMessage());
        }catch (Exception excecao) {
            Logger.getLogger(this.getClass().getName()).log(Level.SEVERE,null,excecao);
            adicionarMensagemErro(excecao, getMensagemAgrupada("errorMessagePersistence"));
        }
    }
}

}[/code]

[code]@ManagedBean
@ViewScoped
public class CidadeControle extends AbstractControle implements Serializable{
/**
* Atributo recebe o EJB CidadeFacade
* @see #facade
*/
@EJB
private CidadeFacade facade;

/**
 * Atributo recebe a lista de relações
 * @see #itens
 */
private List<Cidade> itens = null;


private List<Cidade> filtros;

/**
 * Atributo recebe o cidade selecionada
 * @see #selecionado
 */
private Cidade selecionado;

public CidadeControle() {
    
}

public Cidade getSelecionado() {
    return selecionado;
}

public void setSelecionado(Cidade selecionado) {
    this.selecionado = selecionado;
}

protected void setChavesIncoporaveis(){
    
}

protected void inicializarChaveIncorporavel(){
    
}

public CidadeFacade getFacade() {
    return facade;
}

public List<Cidade> getCidadeFiltrada(){
    return filtros;
}

public void setCidadeFiltrada(List<Cidade> filtradas){
    this.filtros = filtradas;
}

public Cidade prepararCriar(){
    selecionado = new Cidade();
    inicializarChaveIncorporavel();
    return selecionado;
}

public void criar(){
    persistir(PersistirAcao.CRIAR, getMensagemAgrupada("sucessMessageCreate"));
    if (!ehFalhaValidacao()) {
        itens = null; //Invalida a lista de itens e evita a re-query.
    }
}

public void alterar(){
    
    persistir(PersistirAcao.ATUALIZAR, getMensagemAgrupada("sucessMessageChange"));
}

public void destruir(){
    persistir(PersistirAcao.EXCLUIR, getMensagemAgrupada("sucessMessageDelete"));
    if (!ehFalhaValidacao()) {
        selecionado = null; //Remove a seleção
        itens = null; //Invalida a lista de itens e evita a re-query.
    }
}

public void cancelar(){
    selecionado = null;
}

public Cidade getCidade(Long id){
    return getFacade().encontrar(id);
}

public List<Cidade> getItens(){
    if (itens == null) {
        itens = getFacade().encontrarTudo();
    }
    return itens;
}

public List<Cidade> getSelecionarMuitosItensDisponiveis(){
    return getFacade().encontrarTudo();
}

public List<Cidade> getSelecionarUmItensDisponiveis(){
    return getFacade().encontrarTudo();
}

private void persistir(PersistirAcao persistirAcao, String mensagemSucesso){
    if (selecionado != null) {
        setChavesIncoporaveis();
        try{
            if (persistirAcao == PersistirAcao.CRIAR) {
                getFacade().criar(selecionado);
            }else if(persistirAcao == PersistirAcao.ATUALIZAR){
                getFacade().alterar(selecionado);
            }else if(persistirAcao == PersistirAcao.EXCLUIR){
                getFacade().excluir(selecionado.getCodigoCidade());
            }
            adicionarMensagemSucesso(mensagemSucesso);
        }catch(EJBException excecao){
            String mensagem = "";
            Throwable causa = excecao.getCause();
            if (causa == null) {
                mensagem = causa.getLocalizedMessage();
            }
            if (mensagem.length() > 0) {
                adicionarMensagemErro(mensagem);
            } else {
                adicionarMensagemErro(excecao, getMensagemAgrupada("errorMessagePersistence"));                    
            }
        }catch(PersistenceException pe){
            //if(pe.getMessage().contains("ConstraintViolationException"))
                                adicionarMensagemErro(pe, pe.getMessage());
        }catch (Exception excecao) {
            Logger.getLogger(this.getClass().getName()).log(Level.SEVERE,null,excecao);
            adicionarMensagemErro(excecao, getMensagemAgrupada("errorMessagePersistence"));
        }
    }
}

}
[/code]

Abaixo está buscar.xhtml, onde tem os botões para acesso ao dialog “Nova Cidade” pelo um commandButton.

[code] <ui:composition template="/home.xhtml">
<ui:define name=“conteudo”>
<h:form id=“CidadeListForm”>
<p:panel header="#{bundle.pageTitleSearch}">
<p:dataTable id="datalist"
widgetVar=“citysTable"
value=”#{cidadeControle.itens}"
var=“item"
emptyMessage=”#{bundle.messageWarningNoRecordFound}"
selectionMode=“single"
selection=”#{cidadeControle.selecionado}"
paginator=“true"
rowKey=”#{item.codigoCidade}"
rows=“10"
rowsPerPageTemplate=“5,10,20,30,40,50"
filteredValue=”#{cidadeControle.cidadeFiltrada}”
>

                    <p:ajax event="rowSelect"   update="btnNovo btnAlterar  btnVisualizar btnExcluir"/>
                    <p:ajax event="rowUnselect" update="btnNovo btnAlterar  btnVisualizar btnExcluir"/>

                    <p:column headerText="#{bundle.cityTextPostalCode}">
                        <h:outputText value="#{item.cep}"/>
                    </p:column>
                    <p:column headerText="#{bundle.cityText}" filterBy="#{item.cidade}" filterMatchMode="contains">
                        <h:outputText value="#{item.cidade}"/>
                    </p:column>
                    <p:column headerText="#{bundle.stateTextUF}">
                        <h:outputText value="#{item.codigoEstado.uf}"/>
                    </p:column>
                    <f:facet name="footer">
                        <p:commandButton id="#{bundle.buttonNameNew}"    icon="ui-icon-plus" value="#{bundle.buttonTitleNew}" update=":CidadeCreateForm" oncomplete="PF('CidadeCreateDialog').show();" actionListener="#{cidadeControle.prepararCriar}"/>
                        <p:commandButton id="#{bundle.buttonNameChange}" icon="ui-icon-pencil" value="#{bundle.buttonTitleChange}" update=":CidadeEditForm" oncomplete="PF('CidadeEditDialog').show();" disabled="#{empty cidadeControle.selecionado}"/>
                        <p:commandButton id="#{bundle.buttonNameView}"   icon="ui-icon-search" value="#{bundle.buttonTitleView}" update=":CidadeViewForm" oncomplete="PF('CidadeViewDialog').show();" disabled="#{empty cidadeControle.selecionado}"/>
                        <p:commandButton id="#{bundle.buttonNameDelete}" icon="ui-icon-trash" value="#{bundle.buttonTitleDelete}" update=":growl,datalist" actionListener="#{cidadeControle.destruir}" disabled="#{empty cidadeControle.selecionado}">
                            <p:confirm header="Aviso" message="#{bundle.messageWarningConfirmationDelete}" icon="ui-icon-alert"/>
                        </p:commandButton>
                    </f:facet>
                </p:dataTable>
            </p:panel>
        </h:form>
        <ui:include src="criar.xhtml"/>
        <ui:include src="alterar.xhtml"/>
        <ui:include src="visualizar.xhtml"/>
        <ui:include src="../../estrutura/mensagens/mensagens.xhtml"/>
    </ui:define>
</ui:composition>[/code]

o que vc ta chamando na tela, ele tem que chamar no bean também.

por exemplo: value="#{cidadeControle.selecionado.codigoEstado}"

cidadeControle tem que ter o get/set no bean para ele poder pegar e setar, e logicamente, tem que estar estanciado.

[quote=Eiro]o que vc ta chamando na tela, ele tem que chamar no bean também.

por exemplo: value="#{cidadeControle.selecionado.codigoEstado}"

cidadeControle tem que ter o get/set no bean para ele poder pegar e setar, e logicamente, tem que estar estanciado.[/quote]

Não, entendi bem o que você quis dizer?