[JSF] - Erro ao tentar ler uma variável

Bom, ontem eu quebrei cabeça o dia inteiro e não consegui descobrir proque raios isso está acontecendo.

É o seguinte, tem um método (getMesFim) que retorna um inteiro. Só que quando eu lanço ele na página, o selectOneItem não o reconhece e não seleciona o valor devolvido pelo método. Daí, quando eu converti esse método para retornar uma String, funcionou perfeitamente. Porém, outras partes do programa utilizam esses método, por isso ele deve retornar um inteiro. Pensando nisso, eu criei outro método (sMesFim) que retorna uma String. Criei a variável String sMesFim, e os métodos get e set para ela. Na págnia, ou invés de chamar o getMesFim() eu chamo o getSMesFim(). Só que com esse novo método, o JSF traz o seguinte erro:

org.apache.jasper.JasperException: javax.servlet.jsp.JspException: Error getting property 'sMesFim' from bean of type br.com.bb.sigov.atb.MData

bom, eu não queria, mas vou postar os código aki:

MData - meu bean de Data

package br.com.bb.sigov.atb;

import java.lang.*;
import java.util.*;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;

/**
 *
 * @author f9343091
 */
public class MData
{
    private Atb atb = new Atb();
    
    private int mesIni;
    private int mesFim;
    private int ano;
    private String sMesIni;
    private String sMesFim;
    private String sAno;
    private Meses [] listaMeses = null;
    private Anos [] listaAnos = null;
    
    /** Creates a new instance of MData */
    public MData()
    {
        ano = 2007;
        mesFim = mesIni = 3;
    }

    public int getMesIni()
    {
        return mesIni;
    }

    public void setMesIni(int mesIni)
    {
        this.mesIni = mesIni;
    }

    public int getMesFim()
    {
        return mesFim;
    }

    public void setMesFim(int mesFim)
    {
        this.mesFim = mesFim;
    }

    public int getAno()
    {
        return ano;
    }

    public void setAno(int ano)
    {
        this.ano = ano;
    }

    public ArrayList<SelectItem> getListaMeses()
    {
        ArrayList<SelectItem> vlMes = new ArrayList();
        if (listaMeses == null)
            setListaMeses();
        for (int i = 0; i< listaMeses.length;i++)
            vlMes.add( new SelectItem(String.valueOf(listaMeses[i].getMM_REF()), listaMeses[i].getNM_MES() ) );
        return vlMes;
    }

    public void setListaMeses()
    {
        this.listaMeses = atb.mesAtb( ano );
    }

    public ArrayList<SelectItem> getListaAnos()
    {
        if (listaAnos == null)
            setListaAnos();
        ArrayList<SelectItem> vtAno = new ArrayList();
        for (int i = 0; i < listaAnos.length; i++)
            vtAno.add( new SelectItem( String.valueOf(listaAnos[i].getAA_REF()),String.valueOf(listaAnos[i].getAA_REF()) ) );
        return vtAno;
    }

    public void setListaAnos( )
    {
        this.listaAnos = atb.anoAtb();
    }

    public String getSMesIni()
    {
        return sMesIni;
    }

    public void setSMesIni()
    {
        this.sMesIni = String.valueOf(mesIni);
    }

    public String getSMesFim()
    {
        if (sMesFim == null)
            setSMesFim();
        return sMesFim;
    }

    public void setSMesFim()
    {
        this.sMesFim = String.valueOf(mesFim);
    }

    public String getSAno()
    {
        if (sAno == null)
            setSAno();
        return sAno;
    }

    public void setSAno()
    {
        this.sAno = String.valueOf(ano);
    }
    
}

Minha página JSP:

        <f:view>
            <h:form id="frm">
                <h:panelGrid id="opc" width="100%" columns="1">
                    <h:panelGroup>
                        <h:outputText value="Mes: "/>
                        <h:selectOneMenu id="sMes" value="#{MData.sMesFim}" onchange="javascript:submit()" >
                            <f:selectItems value="#{MData.listaMeses}"/>
                        </h:selectOneMenu>
                        <h:outputText value="Ano: "/>
                        <h:selectOneMenu id="sAno" value="#{MData.sAno}" onchange="javascript:submit()" >
                            <f:selectItems value="#{MData.listaAnos}" />
                        </h:selectOneMenu>
                    </h:panelGroup>
                </h:panelGrid>
                <h:panelGrid id="dados" headerClass="tabelaCabecalhoAzulEsquerdo" width="100%">
                    <h:dataTable rendered="#{! empty MPlacar.atbGeral}" value="#{MPlacar.atbGeral}" var="atb"
                                 styleClass="tabelaCabecalhoAzulCentro"
                                 rowClasses="FundoDestaqueBrancoCentro,FundoDestaqueAzulCentro" width="100%"
                                 columnClasses="Centro,Centro,Esquerdo,Centro,Centro,Centro,Centro,Centro,Centro,Centro,Centro"
                                 footerClass="tabelaRodapeAzul">
                        <h:column>
                            <f:facet name="header"><h:outputText value="Super" /></f:facet>
                            <h:outputText value="#{atb.CD_PRF_DEPE_JRDT}"/>
                        </h:column>
                        <h:column>
                            <f:facet name="header"><h:outputText value="Pref."/></f:facet>
                            <h:outputText value="#{atb.CD_PRF_DEPE}"/>
                        </h:column>
                        <h:column>
                            <f:facet name="header"><h:outputText value="Dependência"/></f:facet>
                            <h:outputText value="#{atb.NM_DEPE}"/>
                        </h:column>
                        <h:column>
                            <f:facet name="header"><h:outputText value="R. E." title="Resultado Econômico"/></f:facet>
                            <h:outputText value="#{atb.RESULTADO_ECONOMICO_SMT}"/>
                        </h:column>
                        <h:column>
                            <f:facet name="header"><h:outputText value="E. O." title="Estratégia e Operações"/></f:facet>
                            <h:outputText value="#{atb.ESTRATEGIA_OPERACOES_SMT}"/>
                        </h:column>
                        <h:column>
                            <f:facet name="header"><h:outputText value="Cl." title="Clientes"/></f:facet>
                            <h:outputText value="#{atb.CLIENTES_SMT}"/>
                        </h:column>
                        <h:column>
                            <f:facet name="header"><h:outputText value="P. I." title="Processos Internos"/></f:facet>
                            <h:outputText value="#{atb.PROCESSOS_INTERNOS_SMT}"/>
                        </h:column>
                        <h:column>
                            <f:facet name="header"><h:outputText value="C. O." title="Comportamento Organizacional"/></f:facet>
                            <h:outputText value="#{atb.COMPORTAMENTO_ORGANIZACIONAL_SMT}"/>
                        </h:column>
                        <h:column>
                            <f:facet name="header"><h:outputText value="B. E." title="Bônus Estratégico"/></f:facet>
                            <h:outputText value="#{atb.BONUS_ESTRATEGICO_PTO}"/>
                        </h:column>
                        <h:column>
                            <f:facet name="header"><h:outputText value="DRS" title="Sociedade"/></f:facet>
                            <h:outputText value="#{atb.SOCIEDADE_PTO}"/>
                        </h:column>
                        <h:column>
                            <f:facet name="header"><h:outputText value="Placar" title="Placar"/></f:facet>
                            <h:outputText value="#{atb.TOTAL_PTO}"/>
                        </h:column>
                    </h:dataTable>
                </h:panelGrid>
            </h:form>
        </f:view>

Meu código faces-config


<faces-config>
    <navigation-rule>
        <from-view-id>atbPlacar.jsp</from-view-id>
    </navigation-rule>
    <managed-bean>
        <managed-bean-name>MData</managed-bean-name>
        <managed-bean-class>br.com.bb.sigov.atb.MData</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>MPlacar</managed-bean-name>
        <managed-bean-class>br.com.bb.sigov.atb.MPlacar</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
        <managed-property>
            <property-name>MData</property-name>
            <value>#{MData}</value>
        </managed-property>
    </managed-bean>
</faces-config>

Já me deparei com problemas como esse. Tem haver como as letras maiúsculas e minusculas depois de get/set acredito que seja um bug do jsf. Tenta alterar o nome do get/set.

Uma dica: Depois de fazer muito for para criar SelectItem resolvi pesquisar na net e encontrei um componente que faz isso.

Copiei a implementação do MyFaces Tomahawk

<jkit:selectItems id="moduloItems" value="#{secUseCaseJsfBean.moduloItens}" var="item" itemLabel="item.NOME" itemValue="item.ID_MODULO"/>

Na implementação do código acima moduloItens é um ArrayList de HashMaps

Só funciona com coleções que implementam List.

[]

Fred

O mesmo problema deve ocorrer com sAno

Cara, era isso mesmo. Eu mudei o getSMesFim para getsMesFim e funcionou. E sim, ocoreu o mesmo com sAno.

Outra coisa, me explica esse código que vc postou. Não entendi direto

Para preencher os itens do teu menu vc faz faz uma consulta

 public void setListaAnos( )
 {
     this.listaAnos = atb.anoAtb();
 }

e depois faz um for com os itens para criar os SelectItem

public ArrayList<SelectItem> getListaAnos() { if (listaAnos == null) setListaAnos(); ArrayList<SelectItem> vtAno = new ArrayList(); for (int i = 0; i < listaAnos.length; i++) vtAno.add( new SelectItem( String.valueOf(listaAnos[i].getAA_REF()),String.valueOf(listaAnos[i].getAA_REF()) ) ); return vtAno; }

Utilizando um componente como tem o Myfaces Tomahawk se a tua variável listaAnos implementa List não é necessário criar o método acima é só adicionar a tag no JSP e fazer o get/set para ela.

<h:selectOneMenu id="modulo" binding="#{secUseCaseJsfBean.soModulo}" styleClass="input_select" disabled="#{secUseCaseJsfBean.fieldsDisabled}" required="true"> <f:attribute name="label" value="Módulo" /> <f:converter converterId="javax.faces.Integer" /> <jkit:selectItems id="moduloItems" value="#{secUseCaseJsfBean.moduloItens}" var="item" itemLabel="item.NOME" itemValue="item.ID_MODULO"/> </h:selectOneMenu>

Observe a tag jkit:selectItems é um componente que criei para o meu projeto, copiei do MyFaces Tomahawk.

[]

Fred

Certo, mas o que eu não entendi é sobre os FOR. Está certo que o JSF deve criar um for interno, mas eu não implementei esse for!

Mas de qualquer maneira, obrigado, eu estou estudando esse seu código.

Talvez ele pode me ajudar tb em outro lugar