Ajuda com <p:selectOneMenu /> Resolvido

Boa Tarde eu sou novo no desenvolvimento java/web e estou tentando implementar uma rotina de controle de contas a pagar/receber estou utilizando jsf, primefaces 3.4 além de jpa/eclipseLink, o problema que eu estou tendo é o seguinte de acordo com a ação do usuário eu preciso renderizar dois campos é campo chama-se contas e outro é funcionário/fornecedor conforme imagens em anexo, eu estou utilizando a propriedade valueChangeListener dos campos estou setando os valores corretamente, o problema é quando eu escolho uma forma de pagamento que necessita de uma conta ele submete o formulário traz a conta da empresa, porém a empresa que tinha sido selecionada anteriormente volta como vazia o código que estou usando na página:[code]<h:form id=“frmNovaDespesa”>

        <p:commandButton id="voltarDesp" value="Voltar" action="#{lancamentoController.doListDespesas}" immediate="true" style="margin:20px 0px;"/>

        <p:panel id="pnNovaDespesa" header="Nova Despesa">

            <h:panelGrid id="pgNovaDespesa" columns="3"> 
                
                <p:outputLabel id="lblTipoDespesa" value="Tipo de despesa" for="tipoDespesa" />
                <p:selectOneRadio id="tipoDespesa" value="#{lancamentoController.lancamentoDespesa.despesaTipo}"                                  
                                  valueChangeListener="#{lancamentoController.tipoDespesaChangeListener}" immediate="true" onchange="submit();">
                    <f:selectItems var="tipoDespesa" value="#{lancamentoController.tipoDespesas}" itemLabel="#{tipoDespesa.descricao}" itemValue="#{tipoDespesa}" />                      

                </p:selectOneRadio>
                <p:message id="tipoDespesaMessage" for="tipoDespesa" />                   
                
                <p:outputLabel id="lblEmpresa" value="Empresa" for="empresa"   />
                <p:selectOneMenu id="empresa" value="#{lancamentoController.lancamentoDespesa.empresa}"
                                 valueChangeListener="#{lancamentoController.empresaChangeListener}">
                    <f:selectItem itemLabel="Selecione" noSelectionOption="true"  />
                    <f:selectItems var="empresa" itemLabel="#{empresa.razaoSocial}" itemValue="#{empresa}" value="#{lancamentoController.empresas}"/>                       
                    <p:ajax update="formaPagto"/> 
                </p:selectOneMenu>
                <p:message id="empresaMessage" for="empresa"  />         
                

                <p:outputLabel id="lblFormaPagto" value="Forma de Pagamento" for="formaPagto" />
                <p:selectOneRadio id="formaPagto" value="#{lancamentoController.lancamentoDespesa.formaPagamento}"
                                  immediate="true" onchange="submit()" valueChangeListener="#{lancamentoController.formaPagamentoChangeListener}">
                    <f:selectItems value="#{lancamentoController.formaPagamentos}"  var="formaPagamento" 
                                   itemLabel="#{formaPagamento.descricao}" itemValue="#{formaPagamento}" /> 

                </p:selectOneRadio>
                <p:message id="formaPagtoTipoMessage" for="formaPagto" />

                <p:outputLabel id="lblConta" value="Conta" for="conta" rendered="#{lancamentoController.lancamentoDespesa.necessitaConta}"/>
                <p:selectOneListbox id="conta" value="#{lancamentoController.lancamentoDespesa.conta}" 
                                    rendered="#{lancamentoController.lancamentoDespesa.necessitaConta}" validator="lancamentoDespesaContaValidator">
                    <f:selectItems var="conta" value="#{lancamentoController.contasEmpresas}" itemLabel="#{conta.numero}" itemValue="#{conta}" />
                    <f:attribute id="attConta" name="atbContaRequerida" value="#{lancamentoController.lancamentoDespesa.formaPagamento}"/>
                </p:selectOneListbox>
                <p:message id="contaMessage" for="conta" rendered="#{lancamentoController.lancamentoDespesa.necessitaConta}"/>

                <p:outputLabel id="lblFrequencia" value="Frequência" for="frequencia" />
                <p:selectOneRadio id="frequencia" value="#{lancamentoController.lancamentoDespesa.frequencia}">
                    <f:selectItems var="frequencia" value="#{lancamentoController.frequencias}" itemLabel="#{frequencia.descricao}" itemValue="#{frequencia}" />
                </p:selectOneRadio>
                <p:message id="frequenciaMessage" for="frequencia" />                          

                <p:outputLabel id="lblLancamento" value="Lançamento" for="lancamento"/>
                <p:selectOneMenu id="lancamento" value="#{lancamentoController.lancamentoDespesa.lancamento}">
                    <f:selectItem itemLabel="Selecione" noSelectionOption="true" />
                    <f:selectItems var="lancamento" itemLabel="#{lancamento.nome}" itemValue="#{lancamento}" value="#{lancamentoController.lancamentosDespesas}"/>                                                          
                </p:selectOneMenu>
                <p:message id="lancamentoMessage" for="lancamento" />

                <p:outputLabel id="lblFuncionario" value="Funcionário" for="funcionario" rendered="#{lancamentoController.lancamentoDespesa.despesaTipo eq 'FUNCIONARIO'}" />
                <p:selectOneMenu id="funcionario" value="#{lancamentoController.lancamentoDespesa.funcionario}"                             
                                 rendered="#{lancamentoController.lancamentoDespesa.despesaTipo eq 'FUNCIONARIO'}" validator="responsavelDespesaValidator">
                    <f:selectItem itemLabel="Selecione" noSelectionOption="true"  />
                    <f:selectItems var="funcionario" itemLabel="#{funcionario.nome}" itemValue="#{funcionario}" value="#{lancamentoController.funcionariosByEmpresas}"/>                        
                </p:selectOneMenu> 
                <p:message id="funcionarioMessage" for="funcionario" rendered="#{lancamentoController.lancamentoDespesa.despesaTipo eq 'FUNCIONARIO'}" />

                <p:outputLabel id="lblFornecedor" value="Fornecedores" for="fornecedor" 
                               rendered="#{lancamentoController.lancamentoDespesa.despesaTipo eq 'FORNECEDOR'}" />
                <p:selectOneMenu id="fornecedor" value="#{lancamentoController.lancamentoDespesa.fornecedor}" validator="responsavelDespesaValidator"
                                 rendered="#{lancamentoController.lancamentoDespesa.despesaTipo eq 'FORNECEDOR'}">
                    <f:selectItem itemLabel="Selecione" noSelectionOption="true"  />
                    <f:selectItems var="fornecedor" itemLabel="#{fornecedor.razaoSocial}" itemValue="#{fornecedor}" value="#{lancamentoController.fornecedores}"/>                       
                </p:selectOneMenu>
                <p:message id="fornecedorMessage" for="fornecedor" rendered="#{lancamentoController.lancamentoDespesa.despesaTipo eq 'FORNECEDOR'}" />               

                <p:outputLabel id="lblDataVecto" value="Data de Vencimento" for="dataVecto"/>
                <p:calendar id="dataVecto" value="#{lancamentoController.lancamentoDespesa.dataVencimento}" locale="pt_BR"  showButtonPanel="true" pattern="dd/MM/yyyy" label="Data de Vencimento" />                   
                <p:message id="dataVectoMessage" for="dataVecto" />

                <p:outputLabel id="lblValor" value="Valor" for="valor"/>
                <p:inputText id="valor" value="#{lancamentoController.lancamentoDespesa.valor}">
                    <f:convertNumber id="javax.faces.convert.BigDecimalConverter" minFractionDigits="2"  maxFractionDigits="2" />
                </p:inputText> 
                <p:message id="valorMessage" for="valor"/>                    

                <p:outputLabel id="lblObservacoes" value="Observações" for="observacoes"/>
                <p:editor id="observacoes" value="#{lancamentoController.lancamentoDespesa.observacoes}" width="600"/>
                <h:outputLabel />

                <h:outputLabel />
                <p:commandButton value="Salvar" style="float: right;" icon="ui-icon-disk" actionListener="#{lancamentoController.doFinishCreateDespesa}" update="pnNovaDespesa"/> 
                <h:outputLabel />                    

            </h:panelGrid>   

        </p:panel>
    </h:form>

[/code]
e no managedBeans:[code]
public void empresaChangeListener(ValueChangeEvent event)
{

    lancamentoDespesa.setEmpresa((Empresa) event.getNewValue());

// Empresa empresa = empresaBean.getEmpresaById(Integer.valueOf(event.getNewValue().toString()));
// System.out.println(empresa.getCnpj());
FacesContext.getCurrentInstance().renderResponse();
}

public void formaPagamentoChangeListener(ValueChangeEvent event)
{        

// System.out.println(event.getNewValue().toString());
lancamentoDespesa.setFormaPagamento(LancamentoDespesaFormaPagamento.setLancamentoDespesaFormaPagamento(event.getNewValue().toString()));
FacesContext.getCurrentInstance().renderResponse();
}

public void tipoDespesaChangeListener(ValueChangeEvent event)
{
    lancamentoDespesa.setDespesaTipo(LancamentoDespesaTipo.setLancamentoDespesaTipo(event.getNewValue().toString()));        
    FacesContext.getCurrentInstance().renderResponse();
}

[/code]

Caso alguém possa me ajudar desde já eu agradeço.




Olá miibx5,

Olha o que percebi é que vc tem vários campos Select com dependência ai nesse caso o ideal é usar ajax para alterar o itens desses select’s, no caso o primefaces te auxilia muito facilmente a fazer isso com o uso da tag <p:ajax> como você usou no select “empresa” só que um detalhe se você der somente o render ele não submete o valor do campo para o controller, assim o ideal é que você submeta esse valor da seguinte maneira:

 ...
<f:ajax  execute="@this" update="formaPagto"/> 
...

Assim o valor de empresa será submetido ao objeto no controller, ainda no seu caso eu utilizaria esse modo para os demais select’s ou qualquer coisa dah uma consultada nesse exemplo do primefaces
http://www.primefaces.org/showcase/ui/pprSelect.jsf

se aparecer algum erro no log de eventos cola junto para a gente, ajuda a apontar o erro mais facilmente :S

Primeiramente eu gostaria de agradecer a ajuda de todos, e depois eu não consegui fazer da maneira que você gustavo_l_walker me passou porque não renderiza de jeito nenhum, então eu mudei um pouco a lógica para tem menos campos dependentes e não ficou 100% como eu queria mas ficou até que funcional, meia boca infelizmente mas como só estou trabalhando com java e java web à 5 semanas até que está bom, mas vou procurar cursos pra ficar melhor vou postar aqui as mudanças que fiz pode ser que ajude alguém, mais uma vez meu muito obrigado:
A página?[code]
<h:form id=“frmNovaDespesa”>

        <p:commandButton id="voltarDesp" value="Voltar" action="#{lancamentoController.doListDespesas}" immediate="true" style="margin:20px 0px;"/>

        <p:panel id="pnNovaDespesa" header="Nova Despesa">

            <h:panelGrid id="pgNovaDespesa" columns="3"> 

                <p:outputLabel id="lblEmpresa" value="Empresa" for="empresa"  />
                <p:selectOneMenu id="empresa" value="#{lancamentoController.lancamentoDespesa.empresa}"
                                 valueChangeListener="#{lancamentoController.empresaChangeListener}" style="width: 350px;"  >
                    <f:selectItem itemLabel="Selecione" />
                    <f:selectItems var="empresa" itemLabel="#{empresa.razaoSocial}" itemValue="#{empresa}" value="#{lancamentoController.empresas}"/>                       
                    <p:ajax /> 
                </p:selectOneMenu>
                <p:message id="empresaMessage" for="empresa"  />   

                <p:outputLabel id="lblLancamento" value="Lançamento" for="lancamento"/>
                <p:selectOneMenu id="lancamento" value="#{lancamentoController.lancamentoDespesa.lancamento}"
                                 valueChangeListener="#{lancamentoController.lancamentoChangeListener}"
                                 style="width: 350px;">
                    <f:selectItem itemLabel="Selecione" />
                    <f:selectItems var="lancamento" itemLabel="#{lancamento.nome}" itemValue="#{lancamento}" value="#{lancamentoController.lancamentosDespesas}"/>                                                          
                    <f:ajax  execute="@this" render="@form" />   

                </p:selectOneMenu>
                <p:message id="lancamentoMessage" for="lancamento" />

                <p:outputLabel id="lblFuncionario" value="Funcionário" for="funcionario" 
                               rendered="#{lancamentoController.lancamentoDespesa.lancamento.categoria eq 'FUNCIONARIO'}" />
                <p:selectOneMenu id="funcionario" value="#{lancamentoController.lancamentoDespesa.funcionario}"
                                 rendered="#{lancamentoController.lancamentoDespesa.lancamento.categoria eq 'FUNCIONARIO'}" 
                                 validator="responsavelDespesaValidator">
                    <f:selectItem itemLabel="Selecione" noSelectionOption="true" />
                    <f:selectItems var="funcionario" itemLabel="#{funcionario.nome}" itemValue="#{funcionario}" 
                                   value="#{lancamentoController.funcionariosByEmpresas}"/>                        
                </p:selectOneMenu>
                <p:message id="funcionarioMessage" for="funcionario"  
                           rendered="#{lancamentoController.lancamentoDespesa.lancamento.categoria eq 'FUNCIONARIO'}" />

                <p:outputLabel id="lblFornecedor" value="Fornecedores" for="fornecedor" 
                               rendered="#{lancamentoController.lancamentoDespesa.lancamento.categoria eq 'FORNECEDOR'}" />
                <p:selectOneMenu id="fornecedor" value="#{lancamentoController.lancamentoDespesa.fornecedor}" validator="responsavelDespesaValidator"
                                 rendered="#{lancamentoController.lancamentoDespesa.lancamento.categoria eq 'FORNECEDOR'}">
                    <f:selectItem itemLabel="Selecione" noSelectionOption="true"  />
                    <f:selectItems var="fornecedor" itemLabel="#{fornecedor.razaoSocial}" itemValue="#{fornecedor}" value="#{lancamentoController.fornecedores}"/>                       
                </p:selectOneMenu>
                <p:message id="fornecedorMessage" for="fornecedor" rendered="#{lancamentoController.lancamentoDespesa.lancamento.categoria eq 'FORNECEDOR'}" />   

                <p:outputLabel id="lblFormaPagto" value="Forma de Pagamento" for="formaPagto" />
                <p:selectOneRadio id="formaPagto" value="#{lancamentoController.lancamentoDespesa.formaPagamento}"
                                  valueChangeListener="#{lancamentoController.formaPagamentoChangeListener}">
                    <f:selectItems value="#{lancamentoController.formaPagamentos}"  var="formaPagamento" 
                                   itemLabel="#{formaPagamento.descricao}" itemValue="#{formaPagamento}" /> 
                    <f:ajax execute="@this" render="@form"/> 
                </p:selectOneRadio>
                <p:message id="formaPagtoTipoMessage" for="formaPagto" />

                <p:outputLabel id="lblConta" value="Conta" for="conta" rendered="#{lancamentoController.lancamentoDespesa.necessitaConta}"/>
                <p:selectOneListbox id="conta" value="#{lancamentoController.lancamentoDespesa.conta}" 
                                    rendered="#{lancamentoController.lancamentoDespesa.necessitaConta}" validator="lancamentoDespesaContaValidator">
                    <f:selectItems var="conta" value="#{lancamentoController.contasEmpresas}" itemLabel="#{conta.numero}" itemValue="#{conta}" />
                    <f:attribute id="attConta" name="atbContaRequerida" value="#{lancamentoController.lancamentoDespesa.formaPagamento}"/>
                </p:selectOneListbox>
                <p:message id="contaMessage" for="conta" rendered="#{lancamentoController.lancamentoDespesa.necessitaConta}"/>

                <p:outputLabel id="lblFrequencia" value="Frequência" for="frequencia" />
                <p:selectOneRadio id="frequencia" value="#{lancamentoController.lancamentoDespesa.frequencia}">
                    <f:selectItems var="frequencia" value="#{lancamentoController.frequencias}" itemLabel="#{frequencia.descricao}" itemValue="#{frequencia}" />
                </p:selectOneRadio>
                <p:message id="frequenciaMessage" for="frequencia" />  

                <p:outputLabel id="lblDataVecto" value="Data de Vencimento" for="dataVecto"/>
                <p:calendar id="dataVecto" value="#{lancamentoController.lancamentoDespesa.dataVencimento}" locale="pt_BR"  showButtonPanel="true" pattern="dd/MM/yyyy" label="Data de Vencimento" />                   
                <p:message id="dataVectoMessage" for="dataVecto" />

                <p:outputLabel id="lblValor" value="Valor" for="valor"/>
                <p:inputText id="valor" value="#{lancamentoController.lancamentoDespesa.valor}">
                    <f:convertNumber id="javax.faces.convert.BigDecimalConverter" minFractionDigits="2"  maxFractionDigits="2" />
                </p:inputText> 
                <p:message id="valorMessage" for="valor"/>                    

                <p:outputLabel id="lblObservacoes" value="Observações" for="observacoes"/>
                <p:editor id="observacoes" value="#{lancamentoController.lancamentoDespesa.observacoes}" width="600"/>
                <h:outputLabel />            

                <h:outputLabel />
                <p:commandButton value="Salvar" style="float: right;" icon="ui-icon-disk" actionListener="#{lancamentoController.doFinishCreateDespesa}" update="pnNovaDespesa"/> 
                <h:outputLabel />                    

            </h:panelGrid>   

        </p:panel>
    </h:form>

[/code]
O managedBeans:

@Named(value = "lancamentoController")
@SessionScoped
public class LancamentoController extends BaseCDIBean<Lancamento>
{
    private static final long serialVersionUID = 1L;

    @Inject
    private LancamentoSession bean;

    @Inject
    private EmpresaSession empresaBean;

    @Inject
    private ClienteSession clienteBean;

    private List<Lancamento> lancamentosFiltrados;

    private LancamentoDespesa lancamentoDespesa;

    private LancamentoReceita lancamentoReceita;

    private List<LancamentoReceita> receitas;

    private LancamentoDespesaTipo despesaTipo;

    public LancamentoController()
    {
        lancamentoDespesa = new LancamentoDespesa();
        setSelectedBean(new Lancamento());
    }

    public LancamentoTipo[] getLancamentoTipos()
    {
        return LancamentoTipo.values();
    }

    public LancamentoDespesaFormaPagamento[] getFormaPagamentos()
    {
        return LancamentoDespesaFormaPagamento.values();
    }

    public LancamentoCategoria[] getCategorias()
    {
        return LancamentoCategoria.values();
    }

    public LancamentoFrequencia[] getFrequencias()
    {
        return LancamentoFrequencia.values();
    }

    public List<Lancamento> getLancamentos()
    {
        return bean.getLancamentos();
    }

    public List<LancamentoDespesa> getDespesasNaoPagas()
    {
        return bean.getDespesasNaoPagas();
    }

    public List<LancamentoDespesa> getDespesasPagas()
    {
        return bean.getDespesasPagas();
    }

    public List<Conta> getContasEmpresas()
    {
        return empresaBean.getContasByEmpresa(lancamentoDespesa.getEmpresa());
    }

    public List<Empresa> getFornecedores()
    {
        return empresaBean.getFornecedores();
    }

    public List<Lancamento> getLancamentosDespesas()
    {
        return bean.getLancamentosDespesas();
    }

    public List<Lancamento> getLancamentosReceitas()
    {
        return bean.getLancamentosReceitas();
    }

    public List<Lancamento> getLancamentosAtivos()
    {
        return bean.getLancamentosAtivos();
    }

    public List<Lancamento> getLancamentosFiltrados()
    {
        return lancamentosFiltrados;
    }

    public void setLancamentosFiltrados(List<Lancamento> lancamentosFiltrados)
    {
        this.lancamentosFiltrados = lancamentosFiltrados;
    }

    public LancamentoDespesa getLancamentoDespesa()
    {
        return lancamentoDespesa;
    }

    public void setLancamentoDespesa(LancamentoDespesa lancamentoDespesa)
    {
        this.lancamentoDespesa = lancamentoDespesa;
    }

    public LancamentoReceita getLancamentoReceita()
    {
        return lancamentoReceita;
    }

    public void setLancamentoReceita(LancamentoReceita lancamentoReceita)
    {
        this.lancamentoReceita = lancamentoReceita;
    }

    public LancamentoDespesaTipo getDespesaTipo()
    {
        return despesaTipo;
    }

    public void setDespesaTipo(LancamentoDespesaTipo despesaTipo)
    {
        this.despesaTipo = despesaTipo;
    }

    public List<LancamentoReceita> getReceitas()
    {
        return receitas;
    }

    public void setReceitas(List<LancamentoReceita> receitas)
    {
        this.receitas = receitas;
    }

    public List<Empresa> getEmpresas()
    {
        return empresaBean.getEmpresasAtivas();
    }

    public List<Cliente> getClientes()
    {
        return clienteBean.getClientesAtivos();
    }

    public List<Funcionario> getFuncionariosByEmpresas()
    {
        return empresaBean.getFuncionariosByEmpresa(lancamentoDespesa.getEmpresa());
    }

    public void empresaChangeListener(ValueChangeEvent event)
    {
        lancamentoDespesa.setEmpresa((Empresa)event.getNewValue());
        FacesContext.getCurrentInstance().renderResponse();
    }

    public void lancamentoChangeListener(ValueChangeEvent event)
    {
        lancamentoDespesa.setLancamento((Lancamento)event.getNewValue());
        lancamentoDespesa.getLancamento().setCategoria(lancamentoDespesa.getLancamento().getCategoria());
        FacesContext.getCurrentInstance().renderResponse();
    }

    public void formaPagamentoChangeListener(ValueChangeEvent event)
    {
        if(lancamentoDespesa.getEmpresa() != null)
        {
            lancamentoDespesa.setFormaPagamento(LancamentoDespesaFormaPagamento.setLancamentoDespesaFormaPagamento(event.getNewValue().toString()));
            FacesContext.getCurrentInstance().renderResponse();
        }
    }

    public String doListLancamentos()
    {
        this.getLancamentos();
        return "lancamentos";
    }

    public String doCreateLancamento()
    {
        setSelectedBean(new Lancamento());
        return "novoLancamento";
    }

    public String doFinishCreateLancamento()
    {
        bean.saveLancamento(getSelectedBean());
        return doListLancamentos();
    }

    public String doEditLancamento()
    {
        return "editarLancamento";
    }

    public String doFinishEditLancamento()
    {
        bean.updateLancamento(getSelectedBean());
        return doListLancamentos();
    }

    public String doListDespesas()
    {
        return "/lancamentos/despesas/listar_despesas.jsf?faces-redirect=true";
    }

    public String doCreateDespesa()
    {
        this.getLancamentosAtivos();
        lancamentoDespesa = new LancamentoDespesa();
        return "/lancamentos/despesas/nova_despesa.jsf?faces-redirect=true";
    }

    public String doFinishCreateDespesa()
    {
        bean.saveDespesa(lancamentoDespesa);
        return doListDespesas();
    }

    public String doEditDespesa()
    {
        this.getLancamentosAtivos();
        return "/lancamentos/despesas/editar_despesa.jsf?faces-redirect=true";
    }

    public String doFinishEditDespesa()
    {
        bean.updateDespesa(lancamentoDespesa);
        return doListDespesas();
    }

    public String doListReceitas()
    {
        receitas = bean.getReceitas();
        return "/lancamentos/receitas/listar_receitas.jsf?faces-redirect=true";
    }

    public String doCreateReceita()
    {
        lancamentoReceita = new LancamentoReceita();
        return "/lancamentos/receitas/nova_receita.jsf?faces-redirect=true";
    }

    public String doFinishCreateReceita()
    {
        bean.saveReceita(lancamentoReceita);
        return doListReceitas();
    }

    public String doEditReceita()
    {
        return "/lancamentos/receitas/editar_receita.jsf?faces-redirect=true";
    }

    public String doFinishEditReceita()
    {
        bean.updateReceita(getLancamentoReceita());
        return doListReceitas();
    }
}

Como eu faço pra mudar o status para concluído porque eu consegui resolver o problema?