<h:selectOneMenu/> nao atualiza bean [RESOLVIDO]

Ola pessoal, estou tendo dificuldades em atualizar o bean quando é seleciondo algum no comboBox, o mesmo não atualiza o bean e os valores ficam sempre como nulos

segue abaixo meu codigo JSF e após, o bean

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:a4j="http://richfaces.org/a4j"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:rich="http://richfaces.org/rich"
                xmlns:f="http://java.sun.com/jsf/core"
                template="/template.xhtml">
    <ui:define name="content">
        <a4j:keepAlive ajaxOnly="false" beanName="faltas" />
        <h2>Listar Faltas</h2>
        <hr />
        <rich:panel id="faltasListar">
            <a4j:form id="SearchMiss">
                Selecione as opções:
                <h:panelGrid columns="2">
                    <h:outputText value="Data: "/>
                    <rich:calendar datePattern="dd/MM/yyyy"
                                   value="#{faltas.dataFaltas}">
                        <a4j:support event="onChanged"
                                     process="#{faltas}"/>
                    </rich:calendar>
                    <h:outputText value="CIA: "/>
                    <h:selectOneMenu id="comboCIA"
                                     immediate="true"
                                     converter="converterObjeto"
                                     valueChangeListener="#{faltas.companhiaSelecionada}">
                        <f:selectItems value="#{faltas.companhiaItens}"/>
                    </h:selectOneMenu>
                    <h:outputText value="Post/Grad" />
                    <h:selectOneMenu id="comboGrad"
                                     immediate="true"
                                     converter="converterObjeto"
                                     valueChangeListener="#{faltas.graduacaoSelecionada}">
                        <f:selectItems value="#{faltas.graduacaoItens}"/>
                    </h:selectOneMenu>
                </h:panelGrid>
                <a4j:commandButton action="#{faltas.actListar}"
                                   ajaxSingle="false"
                                   immediate="false"
                                   reRender="SearchMiss"
                                   value="Listar"
                                   type="submit"/>
                <hr />
                <rich:dataTable id="resultTable"
                                rendered="#{not empty faltas.dataModel}"
                                rows="10"
                                var="falta"
                                value="#{faltas.dataModel}">
                    <rich:column>
                        <f:facet name="header">
                            <h:outputText value="Pos/Grad" />
                        </f:facet>
                        <h:outputText value="#{falta.usuario.graduacao}"/>
                    </rich:column>
                     <rich:column>
                        <f:facet name="header">
                            <h:outputText value="Pos/Grad" />
                        </f:facet>
                        <h:outputText value="#{falta.usuario.nomeGuerra}"/>
                    </rich:column>
                     <rich:column>
                        <f:facet name="header">
                            <h:outputText value="Pos/Grad" />
                        </f:facet>
                        <h:outputText value="#{falta.cafeOK}"/>
                    </rich:column>
                     <rich:column>
                        <f:facet name="header">
                            <h:outputText value="Pos/Grad" />
                        </f:facet>
                        <h:outputText value="#{falta.almocoOk}"/>
                    </rich:column>
                     <rich:column>
                        <f:facet name="header">
                            <h:outputText value="Pos/Grad" />
                        </f:facet>
                        <h:outputText value="#{falta.jantaOk}"/>
                    </rich:column>
                </rich:dataTable>
            </a4j:form>
        </rich:panel>
    </ui:define>

</ui:composition>

BEAN



public class ListarFaltasControle {

    private Arranchamento arranchamento;
    private List<SelectItem> companhiaItens;
    private List<SelectItem> graduacaoItens;
    private Companhia companhiaSelecionada;
    private Graduacao graduacaoSelecionada;
    private Graduacao graduacao;
    private Date dataFaltas;
    private DataModel dataModel;

    public ListarFaltasControle() {
    companhiaItens = new ArrayList<SelectItem>();
    CompanhiaDAO daoCompanhia = new CompanhiaDAOImp();
    List<Companhia> listCompanhia = daoCompanhia.findAll();
    for(Companhia c : listCompanhia)
        companhiaItens.add(new SelectItem(c));

    graduacaoItens = new ArrayList<SelectItem>();
    GraduacaoDAO daoGraduacao = new GraduacaoDAOImp();
    List<Graduacao> listGraduacao = daoGraduacao.findAll();
    for(Graduacao g : listGraduacao)
        graduacaoItens.add(new SelectItem(g));
    }

    public void actListar(){
        System.out.println(companhiaSelecionada);
        System.out.println(graduacaoSelecionada);
        try {
            ArranchamentoDAO dao = new ArranchamentoDAOImp();
            List<Arranchamento> listArranchamento = dao.findByFaltas(companhiaSelecionada, graduacao, dataFaltas);
            dataModel = new ListDataModel(listArranchamento);
        } catch (NadaFoiEncontrado ex) {
            FacesUtils.getInstance().adicionaMensagem(ex.getMessage());
        }
    }

    public Arranchamento getArranchamento() {
        return arranchamento;
    }

    public void setArranchamento(Arranchamento arranchamento) {
        this.arranchamento = arranchamento;
    }

    public List<SelectItem> getCompanhiaItens() {
        return companhiaItens;
    }

    public void setCompanhiaItens(List<SelectItem> companhiaItens) {
        this.companhiaItens = companhiaItens;
    }

    public Companhia getCompanhiaSelecionada() {
        return companhiaSelecionada;
    }

    public void setCompanhiaSelecionada(Companhia companhiaSelecionada) {
        System.out.println(companhiaSelecionada);
        this.companhiaSelecionada = companhiaSelecionada;
    }

    public Graduacao getGraduacao() {
        return graduacao;
    }

    public void setGraduacao(Graduacao graduacao) {
        this.graduacao = graduacao;
    }

    public List<SelectItem> getGraduacaoItens() {
        return graduacaoItens;
    }

    public void setGraduacaoItens(List<SelectItem> graduacaoItens) {
        this.graduacaoItens = graduacaoItens;
    }

    public Date getDataFaltas() {
        return dataFaltas;
    }

    public void setDataFaltas(Date dataFaltas) {
        this.dataFaltas = dataFaltas;
    }

    public Graduacao getGraduacaoSelecionada() {
        return graduacaoSelecionada;
    }

    public void setGraduacaoSelecionada(Graduacao graduacaoSelecionada) {
        System.out.println(gra);
        this.graduacaoSelecionada = graduacaoSelecionada;
    }

    public DataModel getDataModel() {
        return dataModel;
    }

    public void setDataModel(DataModel dataModel) {
        this.dataModel = dataModel;
    }
}

Alguem tem alguma ideia?

O atributo do bean que vai receber o valor do combo precisa estar definido no atributo ‘value’ so selectOneMenu.

Ola, então eu havia colocado o value#{faltas.graduacaoSelecionada} e value#{faltas.companhiaSelecionada} aih estava verificando o pessoal falar pra colocar o valuechagedListener, mas não fucionou tbm, daih esqueçi de adicionar o value q estava rsrsr, teria algo mais para verificar?
Abrass galera

Tire os

     immediate="true"  

das combos

e vc nao precisa disso:


  ajaxSingle="false"  
  immediate="false"  

por padrao jah e false.

Dae galerinha obrigado pelo auxilio…
mas ainda nao está funcionando :S

Removi o ajaxSingle e também o immediate, coloquei o value nos combos e tirei o valueChengeListner

está assim:

  <h:selectOneMenu id="comboCIA"
                                     converter="converterObjeto"
                                     value="#{faltas.companhiaSelecionada}">
                        <f:selectItems value="#{faltas.companhiaItens}"/>
                    </h:selectOneMenu>
                    <h:outputText value="Post/Grad" />
                    <h:selectOneMenu id="comboGrad"
                                     converter="converterObjeto"
                                     value="#{faltas.graduacaoSelecionada}">
                        <f:selectItems value="#{faltas.graduacaoItens}"/>
                    </h:selectOneMenu>
                </h:panelGrid>
                <a4j:commandButton action="#{faltas.actListar}"
                                   reRender="SearchMiss"
                                   value="Listar"
                                   type="submit"/>
                <hr />

Dei um SysntemOut pegando o valor do graduacaoSelecionada e do companhiaSelectionada e estão como nulos ainda
Agradeço a auxilio novamente

outra coisa,troque seu <a4j:form por um h:form>

ola pessoal desculpe a demora…

ainda não está funcionando! :S

Igweb, creio que não faça mto sentido alterar para <h:form>, pois ele deveria funcionar com a4j:form também

mas tentei colocar aqui e nda também

se alguem tiver outra dica eu agradeço

Obrigado!

Como está o seu conversor? Voce esta utilizando o mesmo converter para objetos diferente, está tratando certo isso?
E o seu faces config está mapeado corretamente?

Ola Pessoal, desculpem a demora para responder, tive alguns impecilios :S

entao Ygor o meu converter está assim:

public class ConverterObjeto 
        implements Converter{

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        Object o = component.getAttributes().get(value);
        return o;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        if(value != null)
              return value.toString();
        return "";
    }

}

e sim, estou usando o mesmo converter para os dois combos, ou seja eles irão me trazer objetos diferentes!

o faces está mapeando normalmente, pois ele não da nenhum erro em tempo de execução…pois ao submter o formulário, o mesma envia para o bean a data do rich:calendar, pois testei com o system.out

Já procurei mais por outros lugares, mas nda da solução :s

Agradeço a ajuda de vcs!

Obrigado!

Ola galerinha…entao

eu estava verificando e o problema é que quando ele entra no converter para buscar como objeto, o objeto retornado é nulo, por este motivo o meu graduacaoSelecionada ou companhiaSelecionado fica como nulo.

eu estava pensando aqui.

bom, eu posso pesquisar no banco por esta string e retornar o objeto. Mas acho que seria meio gambiarra, e outra chamada no banco, o me custaria alguns processos a mais creio eu.

O que vocês me aconselham a fazer?

tem alguma outra idéia?

Agradeço a ajuda!!!

Ola pessoal…

consegui resolver, adicionei nos atributos do componente o valor toString e o valor objeto, então ele me retornou o objeto normalmente…
segue abaixo como ficou:

public class ConverterObjeto implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {

        if (value != null) {
            return component.getAttributes().get(value);
        }
        return null;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        if (value != null
                && !"".equals(value)) {
            component.getAttributes().put(value.toString(), value);
            return value.toString();
        }
        return "";
    }
}

=D

Obrigado pela Ajuda de todos

a

Sim, eu já tinha feito isso. Mas o problema era realmente no converter =D