[RESOLVIDO] popoup de inclusão não seta a propriedade no beans - primefaces

Bom dia pessoal.

Na minha pagina de cadastro de clientes, ao clicar no botão incluir, é aberto um popup para inclusão de um novo cliente. As propriedades do cadastro apontam para a propriedade “cliente” do meu bean, mas ao chamar o metodo de inclusão, a propriedade cliente está nula, não recebe o que foi digitado no popup.

xhtml:

            <p:commandButton action="#{clientesBean.startInclui}" icon="ui-icon-plusthick"     
                             process="@this" update=":formInclui" ajax="true" value="incluir" onclick="dlg1.show();">    
                <f:setPropertyActionListener target="#{clientesBean.empresa}" value="#{loginBean.empresa}"/>    
            </p:commandButton>

.....

        <p:dialog dynamic="true" header="Inclusão de clientes" widgetVar="dlg1" resizable="false" modal="true" closable="false">   
            <h:form id="formInclui"> 
                <div align="center">
                <h:outputText style="color:red" value="* campo obrigatorio"/>
                <br/>
                    <h:panelGrid id="panel" columns="3" cellpadding="5">  
                        
                        <h:outputLabel style="font-size: small" for="nome" value="nome:" />  
                        <p:inputText required="true" style="font-size: small" value="#{clientesBean.cliente.nome}"   
                                id="nome" label="nome" />
                        <h:outputText value="*" style="color:red"/>
                        
                        <h:outputLabel style="font-size: small" for="tipo" value="F/J:" />  
                        <p:selectOneMenu required="true" style="font-size: small" value="#{clientesBean.cliente.acsTipoPessoa}" id="tipo" label="tipo">
                            <f:selectItem itemValue="" itemLabel="--Selecione--"/>
                            <f:selectItems value="#{clientesBean.tipoPessoa}" var="tipo" itemLabel="#{tipo.descricao}" itemValue="#{tipo}"/>
                        </p:selectOneMenu>
                        <h:outputText value="*" style="color:red"/>

                        <h:outputLabel style="font-size: small" for="documento" value="CPF/CNPJ:" />  
                        <p:inputText style="font-size: small" value="#{clientesBean.cliente.cpfCnpj}"   
                                id="documento" label="documento" />
                        <h:outputText value="" style="color:red"/>
                        
                        <h:outputLabel style="font-size: small" for="endereco" value="endereco:" />  
                        <p:inputText style="font-size: small" value="#{clientesBean.cliente.endereco}"   
                                id="endereco" label="endereco" />
                        <h:outputText value="" style="color:red"/>
                        
                        <h:outputLabel style="font-size: small" for="numero" value="numero:" />  
                        <p:inputText style="font-size: small" value="#{clientesBean.cliente.numero}"   
                                id="numero" label="numero" />
                        <h:outputText value="" style="color:red"/>
                        
                        <h:outputLabel style="font-size: small" for="complemento" value="complemento:" />  
                        <p:inputText style="font-size: small" value="#{clientesBean.cliente.complemento}"   
                                id="complemento" label="complemento" />
                        <h:outputText value="" style="color:red"/>
                        
                        <h:outputLabel style="font-size: small" for="bairro" value="bairro:" />  
                        <p:inputText style="font-size: small" value="#{clientesBean.cliente.bairro}"   
                                id="bairro" label="bairro" />
                        <h:outputText value="" style="color:red"/>
                        
                        <h:outputLabel style="font-size: small" for="estado" value="UF:" />  
                        <p:selectOneMenu required="true" style="font-size: small" value="#{clientesBean.cliente.acsEstado}" 
                                         id="estado" label="estado">
                            <p:ajax update="cidade" process="@this"  listener="#{clientesBean.atualizaCidades}"/>  
                            <f:selectItem itemValue="#{clientesBean.empresa.acsEstado}" itemLabel="#{clientesBean.empresa.acsEstado.uf}"/>
                            <f:selectItems value="#{clientesBean.estados}" var="estado" itemLabel="#{estado.uf}" itemValue="#{estado}"/>
                        </p:selectOneMenu>
                        <h:outputText value="*" style="color:red"/>

                        <h:outputLabel style="font-size: small" for="cidade" value="cidade:" />  
                        <p:selectOneMenu required="true" style="font-size: small" value="#{clientesBean.cliente.acsCidade}" 
                                         id="cidade" label="cidade">
                            <f:selectItem itemValue="#{clientesBean.empresa.acsCidade}" itemLabel="#{clientesBean.empresa.acsCidade.cidade}"/>
                            <f:selectItems value="#{clientesBean.cidades}" var="cidade" itemLabel="#{cidade.cidade}" itemValue="#{cidade}"/>
                        </p:selectOneMenu>
                        <h:outputText value="*" style="color:red"/>

                        <h:outputLabel style="font-size: small" for="ddd" value="ddd" />
                        <p:inputText style="font-size:small; size:9px " value="#{clientesBean.cliente.ddd}"   
                                id="ddd" label="ddd" />  
                        <h:outputText value="" style="text-decoration-color:red"/>

                        <h:outputLabel style="font-size: small" for="telefone" value="Telefone:" />
                        <p:inputText style="font-size:small; size:9px " value="#{clientesBean.cliente.telefone}"   
                                id="telefone" label="telefone" />  
                        <h:outputText value="" style="text-decoration-color:red"/>

                        <h:outputLabel style="font-size: small" for="observacao" value="observacao:" />
                        <p:inputTextarea style="font-size: small" value="#{clientesBean.cliente.observacao}"   
                                id="observacao" label="observacao" />  
                        <h:outputText value="" style="text-decoration-color:red"/>
                        
                    </h:panelGrid>
                    <h:panelGrid columns="2">
                        <p:commandButton action="#{clientesBean.inclui}" id="submitButton" icon="ui-icon-disk" 
                                         value="gravar" ajax="true" process="@this" 
                                         update=":formCliente:tabelaClientes" oncomplete="dlg1.hide();">
                        </p:commandButton>
                        <p:commandButton id="cancelButton" icon="ui-icon-close" value="cancelar" ajax="true" oncomplete="dlg1.hide();">
                        </p:commandButton>
                    </h:panelGrid>
                </div>
            </h:form> 
        </p:dialog> 

bean:

@ManagedBean
@RequestScoped
public class ClientesBean {

    public DlvClientes cliente;

    public void startInclui() {
        System.out.println("ClientesBean.startInclui: ");
        cliente = new DlvClientes();
        cliente.setAcsEmpresa(empresa);
        cliente.setAcsCidade(empresa.getAcsCidade());
        cliente.setAcsEstado(empresa.getAcsEstado());
        System.out.println("ClientesBean.startInclui: empresa: " + empresa.getFantasia());
        System.out.println("ClientesBean.startInclui: cliente - empresa: " + cliente.getAcsEmpresa().getFantasia());
        System.out.println("ClientesBean.startInclui: cliente - estado: " + empresa.getAcsEstado().getUf());
        System.out.println("ClientesBean.startInclui: cliente - cidade: " + empresa.getAcsCidade().getCidade());
        cidades = (List<AcsCidade>) session.createQuery("select c from AcsCidade c where c.acsEstado.idEstado = :idEstado").setInteger("idEstado", empresa.getAcsEstado().getIdEstado()).list();
    }

    public void inclui() {
        System.out.println("ClientesBean.inclui");
        System.out.println("ClientesBean.inclui - cliente: " + cliente.getNome());
        System.out.println("ClientesBean.inclui - empresa: " + cliente.getAcsEmpresa().getFantasia());
        System.out.println("ClientesBean.inclui - uf: " + cliente.getAcsEstado().getUf());
        System.out.println("ClientesBean.inclui - cidade: " + cliente.getAcsCidade().getCidade());
        session.save(cliente);
        session.beginTransaction().commit();
    }

Ao abrir o popup, as propriedades setadas para “cliente” no metodo startInclui() estão ok, e são printadas direitinho no log, mas ao gravar, fazendo a chamada do metodo inclui, todas as propriedades chegam nulas, até mesmo as setadas no metodo startInclui().

seu managedBean está como @RequestScope o que isso significa?
Já deu uma estudada nos tipos de Escopos?

Bom dia Kleber.

Alterei meu escopo para sessão, com esta alteração, os campos setados no metodo startInclui para a propriedade cliente foram exibidos corretamente nos println do metodo inclui, no entanto, os campos digitados no popup não estão sendo setados na propriedade cliente:

ClientesBean.inclui
ClientesBean.inclui - cliente: null
ClientesBean.inclui - empresa: JVMSoftware
ClientesBean.inclui - uf: SP
ClientesBean.inclui - cidade: Campinas

veja que cliente está nulo, neste println estou jogando o nome, que foi preenchido no popup.

por default o ajax do prime e true, sendo assim não precisa colocar,
o seu botão

<p:commandButton action="#{clientesBean.inclui}" id="submitButton" icon="ui-icon-disk"   
                                         value="gravar" ajax="true" process="@this"   
                                         update=":formCliente:tabelaClientes" oncomplete="dlg1.hide();"> 

está com o process this, o que quer dizer para processar apenas ele, mude para @form, ou o grid, ou o que vc quiser.

outra coisa, vc apenas alterou o escopo ou buscou saber o que significa?

alterei o process de @this para @form e @all, mas quando faço estas alterações o metodo do bean que está no action não é chamado.
já tentei alterar também o action para actionListener, mas também não funcionou.

Sim, sei busquei novamente informações sobre os escopos. No caso do request, o bean é instanciado toda vez que é chamado, neste caso, sempre é necessário enviar os parametros que o bean vai precisar intenamente. No caso so session, uma vez instanciado, o bean não perde as informações que contem enquanto a sessão existir.

tem campos com o atributo required = true?

ponha um p:messages autoUpdate=true
para ver se aparece alguma mensagem.

ele não está chegando no método por algum erro de conversão, validação ou não está sabendo o que processar.

vc precisa entender os conceitos para então saber o pq não acontece as coisas, o @this funciona pq não precisa processar nada, e desta forma, nada será colocado nos atributos do bean.

Valeu Kleber, consegui aqui.

incluindo as mensagens na exibição, como você sugeriu, percebi que estavam faltando os conversores dos combos e os metodos para possibilitar a criação deles nas classes de persistencia (equals / hashCode / toString).

Persistencia:

....

public class AcsEstado  implements java.io.Serializable {


     private int idEstado;
     private String uf;
     private String estado;
     private boolean ativo;

....

    public AcsEstado() {
    }
	
....

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 41 * hash + this.idEstado;
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final AcsEstado other = (AcsEstado) obj;
        if (this.idEstado != other.idEstado) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {  
            return (idEstado + ":");
    }
}

Conversor:

@FacesConverter(value="estadoConversor", forClass=AcsEstado.class)  
public class AcsEstadoConversor implements Converter{

    private static final long serialVersionUID = 1L;
    public SessionFactory sf = getSessionFactory();
    public Session session = sf.openSession();

    @Override  
    public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException {
        System.out.println("AcsEstadoConversor.getAsObject - value: " + value);
        Integer idEst; 
        if (value == null || "".equals(value)) {
            return null;
        }      
        // pega o parametro do valor recebido
        String[] tokens = value.split(":");
        String param = tokens[0];
        // transforma o string do parametro em inteiro
        idEst = Integer.parseInt(param);
        
        if(param != null) {  
            return session.get(AcsEstado.class, idEst);  
        }  
        return null;  
    }  
  
    @Override  
    public String getAsString(FacesContext context, UIComponent component, Object object) throws ConverterException {  
        if(object != null && object instanceof AcsEstado) {  
            return ((AcsEstado)object).toString();  
        }  
        return null;  
    }  
}

funcionou direitinho… valeu