Receber valor selectOneMenu em um método

Bom dia pessoal.
Estou com um problemão. Tenho uma tabela que entre seus atibutos tem uma coluna ano e outra mês. No meu formulário xhtml eu tenho dois selectOneMenu, um para ano e outro para mê. O probema começa aqui. Eu quero selecionar o ano e preciso que o selectOneMenu seja preenchido apenas com os meses que são daquelça ano na tabela.
E depois de selecionar o mês eu preciso que seja gerado uma lista com os dados da tabela contemplados pelo filtros ano e mês.
O selectOneMenu ano eu sonsigo preenceher, porém o selectOneMenu mês eu preciso passar o parâmetro ano para o método que gera s lista de meses, e aqui esta o segundo e maior problema. Já tentei de tudo, li vários artigos e posts e não consegui sair do lugar.

package br.com.bb.uro.painelDeRisco.MB;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.List;

import javax.faces.event.ValueChangeEvent;

import org.hibernate.Session;

import br.com.bb.uro.painelDeRisco.auxiliar.DataAtual;
import br.com.bb.uro.painelDeRisco.facade.PerdaProcessoFacade;
import br.com.bb.uro.painelDeRisco.modelo.PerdaProcesso;

/**
*

  • @author F8907199

  • @version 1.0 12/12/2015
    */
    @javax.faces.bean.ManagedBean
    @javax.faces.bean.SessionScoped
    public class PerdaProcessoMB extends AbstractMB implements Serializable {

    /**
    *
    */
    private static final long serialVersionUID = 1L;

    private List listaAnoMes;

    private List listaNvl1;
    private List listaNvl2;
    private List listaNvl3;

    private List listaMes;
    private List listaAno;

    private PerdaProcesso objNvl1;
    private PerdaProcesso objNvl2;

    private PerdaProcesso objAno;
    private PerdaProcesso objMes;
    private PerdaProcesso objAnoMes;

    public Integer eventoAno(ValueChangeEvent event) {

     return (Integer) event.getNewValue();
    

    }

    public void eventoMes(ValueChangeEvent event) {
    event.getNewValue();
    event.getOldValue();
    }

    // Atualiza lista MesAno
    public void atualizarListaAnoMes() {
    DataAtual d = new DataAtual();
    listaAnoMes = new PerdaProcessoFacade().buscarProcessosAnoMes(d
    .AnoMesUltimosDozeMeses());
    }

    public List getListaAnoMes() {
    if (listaAnoMes == null && getFunciBb() != null) {
    atualizarListaAnoMes();
    }
    return listaAnoMes;
    }

    public void setListaAnoMes(List listaAnoMes) {
    this.listaAnoMes = listaAnoMes;
    }

    // Atualiza lista nível 1
    public void atualizarListaNvl1() {
    DataAtual d = new DataAtual();
    System.out.println("atualizarListaNvl1 " + d.AnoMesUltimosDozeMeses());
    listaNvl1 = new PerdaProcessoFacade().buscarProcessosNvl1(null, null,
    d.AnoMesUltimosDozeMeses());
    }

    // Atualiza lista nível 2
    public void atualizarListaNvl2() {
    DataAtual d = new DataAtual();
    System.out.println("atualizarListaNvl2 " + d.AnoMesUltimosDozeMeses());
    listaNvl2 = new PerdaProcessoFacade().buscarProcessosNvl2(
    objNvl1.getProcessoNivel1(), null, null,
    d.AnoMesUltimosDozeMeses());
    }

    // Atualiza lista nível 3
    public void atualizarListaNvl3() {
    DataAtual d = new DataAtual();
    System.out.println("atualizarListaNvl3 " + d.AnoMesUltimosDozeMeses());
    listaNvl3 = new PerdaProcessoFacade().buscarProcessosNvl3(
    objNvl2.getProcessoNivel2(), null, null,
    d.AnoMesUltimosDozeMeses());
    }

    public List getListaNvl1() {
    if (listaNvl1 == null && getFunciBb() != null) {
    atualizarListaNvl1();
    }
    return listaNvl1;
    }

    public void setListaNvl1(List listaNvl1) {
    this.listaNvl1 = listaNvl1;
    }

    public static long getSerialversionuid() {
    return serialVersionUID;
    }

    public List getListaNvl2() {
    return listaNvl2;
    }

    public void setListaNvl2(List listaNvl2) {
    this.listaNvl2 = listaNvl2;
    }

    public List getListaNvl3() {
    return listaNvl3;
    }

    public void setListaNvl3(List listaNvl3) {
    this.listaNvl3 = listaNvl3;
    }

    public PerdaProcesso getObjNvl1() {
    return objNvl1;
    }

    public void setObjNvl1(PerdaProcesso objNvl1) {
    this.objNvl1 = objNvl1;
    }

    public PerdaProcesso getObjNvl2() {
    return objNvl2;
    }

    public void setObjNvl2(PerdaProcesso objNvl2) {
    this.objNvl2 = objNvl2;
    }

    public PerdaProcesso getObjAnoMes() {
    return objAnoMes;
    }

    public void setObjAnoMes(PerdaProcesso objAnoMes) {
    this.objAnoMes = objAnoMes;
    }

    /** Listas Ano e Mes------------------------------------------------ */

    public void atualizarListaAno() {
    listaAno = new PerdaProcessoFacade().buscarAno();
    }

    public void atualizarListaMes(Integer ano) {
    listaMes = new PerdaProcessoFacade().buscarMes(null);
    }

    public List getListaAno() {
    if (listaAno == null) {
    atualizarListaAno();
    }
    return listaAno;
    }

    public void setListaAno(List listaAno) {
    this.listaAno = listaAno;
    }

** public List getListaMes() {**
** if (listaMes == null) {**
** atualizarListaMes(ano);**
** }**
** return listaMes;**
** }**

public void setListaMes(List<PerdaProcesso> listaMes) {
    this.listaMes = listaMes;
}

public PerdaProcesso getObjAno() {
    return objAno;
}

public void setObjAno(PerdaProcesso objAno) {
    this.objAno = objAno;
}

public PerdaProcesso getObjMes() {
    return objMes;
}

public void setObjMes(PerdaProcesso objMes) {
    this.objMes = objMes;
}

}

<h:panelGrid columns=“2”>

            <h:panelGrid>
                <p:outputLabel for="ano" value="Ano" />
                <p:selectOneMenu binding="comboAno" id="ano" value="#{perdaProcessoMB.listaAno}" valueChangeListener="#{perdaProcessoMB.eventoAno}" immediate="true">
                    <f:selectItem itemLabel="selecione" itemValue="" noSelectionOption="true" />
                    <f:selectItems value="#{perdaProcessoMB.listaAno}" var="la" itemLabel="#{la.ano}" itemValue="#{la.ano}" />
                    <p:ajax event="change" listener="#{perdaProcessoMB.listaMes}" update=":form:mes" />
                </p:selectOneMenu>
            </h:panelGrid>
            
            <h:panelGrid>
                <p:outputLabel for="mes" value="Mes" />
                <p:selectOneMenu binding="comboMes" id="mes" value="#{perdaProcessoMB.listaMes}" valueChangeListener="#{perdaProcessoMB.eventoMes" immediate="true">
                    <f:selectItem itemLabel="selecione" itemValue="" noSelectionOption="true" />
                    <f:selectItems value="#{perdaProcessoMB.listaMes}" var="lm" itemLabel="#{lm.mes}" itemValue="#{lm.mes}" />
                </p:selectOneMenu>
            </h:panelGrid>
        
        </h:panelGrid>

`tenta isso:

private Integer ano;
//getters e setters

public Integer eventoAno(ValueChangeEvent event) {
ano = (Integer) event.getNewValue();
return (Integer) event.getNewValue();
}
`

Luciano01, obrigado pela resposta.
Mas não funcionou e retornou o erro abaixo:

javax.servlet.ServletException: java.lang.String cannot be cast to javax.faces.component.UIComponent
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:325)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:98)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at br.com.bb.uro.util.HibernateSessionRequestFilter.doFilter(HibernateSessionRequestFilter.java:48)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at br.com.bb.sso.api.filter.FiltroSeguranca.doFilter(FiltroSeguranca.java:115)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:409)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1044)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to javax.faces.component.UIComponent
at com.sun.faces.application.ApplicationImpl.createComponentApplyAnnotations(ApplicationImpl.java:1889)
at com.sun.faces.application.ApplicationImpl.createComponent(ApplicationImpl.java:1109)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.createComponent(ComponentTagHandlerDelegateImpl.java:511)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:157)
at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98)
at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:184)
at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98)
at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:184)
at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98)
at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:184)
at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98)
at com.sun.faces.facelets.tag.ui.DefineHandler.applyDefinition(DefineHandler.java:103)
at com.sun.faces.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:178)
at com.sun.faces.facelets.impl.DefaultFaceletContext$TemplateManager.apply(DefaultFaceletContext.java:395)
at com.sun.faces.facelets.impl.DefaultFaceletContext.includeDefinition(DefaultFaceletContext.java:366)
at com.sun.faces.facelets.tag.ui.InsertHandler.apply(InsertHandler.java:108)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98)
at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:184)
at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98)
at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98)
at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:82)
at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:308)
at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:367)
at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:346)
at com.sun.faces.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:199)
at com.sun.faces.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:155)
at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93)
at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:82)
at com.sun.faces.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:152)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.buildView(FaceletViewHandlingStrategy.java:744)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:100)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:313)
… 28 more

Eu tenho que passar o parêmetro ano para o método atualizarListaMes:

public List getListaMes() {
if (listaMes == null) {
atualizarListaMes(ano);
}
return listaMes;
}

public void atualizarListaMes(Integer ano) {
listaMes = new PerdaProcessoFacade().buscarMes(ano);
}

acredito que ele está reclamando do binding do componente, como não vi na classe controle nenhuma propriedade relativa ao componente selectonemenu retire o binding dos selectonemenu. Pelo que entendi o erro diz que vc quer converter uma String (valor do selectonemenu) num objeto do tipo UIComponent, no caso o selectonemenu, retire também os immediate

Cponsegui, com uma grande ajudo do meu isntrutor Alexandre Aquilis da Caelum/Df.

Efetuei os seguintes passos:

  • coloquei getter e setter para ano no PerdaProcessoMB
  • adicionei atributo mes com getter e setter no PerdaProcessoMB
  • criei um metodo mudaMes no PerdaProcessoMB, que é chamado no onchange do ano
  • mudei o .xhtml para usar os valores acima
  • corrigi o método atualizarListaMes da PerdaProcessoMB e o método buscarMes do PerdaProcessoFacade para nao passar null, mas o ano

O .xhtml

<h:panelGrid columns=“2”>

            <h:panelGrid>
                <p:outputLabel for="ano" value="Ano" />
                <p:selectOneMenu id="ano" value="#{perdaProcessoMB.ano}">
                    <f:selectItem itemLabel="..." itemValue="Null" noSelectionOption="true" />
                    <f:selectItems value="#{perdaProcessoMB.listaAno}" var="la" itemLabel="#{la.ano}" itemValue="#{la.ano}" />
                    <p:ajax event="change" listener="#{perdaProcessoMB.mudaMes}" update=":form:mes" />
                </p:selectOneMenu>
            </h:panelGrid>

            <h:panelGrid>
                <p:outputLabel for="mes" value="M&ecirc;s" />
                <p:selectOneMenu id="mes" value="#{perdaProcessoMB.mes}">
                    <f:selectItem itemLabel="..." itemValue="Null" noSelectionOption="true" />
                    <f:selectItems value="#{perdaProcessoMB.listaMes}" var="lm" itemLabel="#{lm.mes}" itemValue="#{lm.mes}" />
                    <p:ajax event="change" listener="#{perdaProcessoMB.filtraPorAnoMes}" update=":form:tbl" />
                </p:selectOneMenu>
            </h:panelGrid>
            
        </h:panelGrid>

PerdaProcessoMB.java

@javax.faces.bean.ManagedBean@javax.faces.bean.SessionScopedpublic class PerdaProcessoMB extends AbstractMB implements Serializable {

//outros atributos...

private Integer ano;    
private Integer mes;

    //getters e setters de ano e mes        

public Integer getAno() {
    return ano;    
}
public void setAno(Integer ano) {
    this.ano = ano;    
}
public Integer getMes() {
    return mes;
}
public void setMes(Integer mes) {
    this.mes = mes;    
}

    //metodo chamada no onchange do select de ano    
public void mudaMes() {
    if (ano != null) {
        atualizarListaMes(ano);
    }    
}
    
//usar parametro ano no buscarMes do Facade        
public void atualizarListaMes(Integer ano) {
        listaMes = new PerdaProcessoFacade().buscarMes(ano);
    }

}

PerdaProcessoFacade.java

public class PerdaProcessoFacade implements Serializable {

//outros métodos...
       
//usar parametro ano no buscarMes da DAO        
public List<PerdaProcesso> buscarMes(Integer ano) {
    return new PerdaProcessoDAO().buscarMes(ano);
    }
}