[RESOLVIDO]Problemas com combobox aninhados

8 respostas
C

Olá,

Estou desenvolvendo uma aplicação em JSF no qual tem um modulo que preciso escolher a cidade em que o usuário irá viajar. Estou com o seguinte problema tenho um combobox de estados que quando o estado é selecionado o combobox de cidades deveria puxar as cidades do estado escolhido, pois bem já procurei em diversos foruns inclusive aqui e não achei uma solução pro meu problema. Segue o codigo da MB e da pagina.

<h:outputText value="Roteiro:"/>
                            <h:outputText value="UF: "/>
                            <h:selectOneMenu id="comboEstado" value="#{diariaBean.estado.uf}" >
                                <f:selectItems value="#{diariaBean.popularEstados}"/>
                                <a4j:support event="onchange" ajaxSingle="true" action="#{diariaBean.popularCidades}" reRender ="comboEstado,comboCidades"/>
                            </h:selectOneMenu>
                            <h:selectOneMenu id="comboCidades" value="#{diariaBean.cidade.nome}">
                                <f:selectItems value="#{diariaBean.listaDoSelectItem}"/>
                            </h:selectOneMenu>

Codigo do MB que popula o estado e cidade

public List<SelectItem> getPopularEstados() {
        this.setListaDoSelectItem(new ArrayList<SelectItem>());
        List<String> estados = new ArrayList<String>();
        for (Estado e: listEstado){
            estados.add(e.getUf());
        }
        Set<String> hashset = new HashSet<String>(estados);
        estados = new ArrayList(hashset);
        Collections.sort(estados);
        for (String estadolocal: estados){
            this.listaDoSelectItem.add(new SelectItem(estadolocal));
        }
        return this.listaDoSelectItem;
    }

public List<SelectItem> getpopularCidades() {
        this.setListaDoSelectItem(new ArrayList<SelectItem>());
        List<String> cidades = new ArrayList<String>();
        for (Cidade c: listCidade){
            if (c.getAeEstado().getUf().equals(this.estado.getUf())){
                cidades.add(c.getNome());
            }
        }
        Set<String> hashset = new HashSet<String>(cidades);
        cidades = new ArrayList(hashset);
        Collections.sort(cidades);
        for (String cd: cidades){
            this.listaDoSelectItem.add(new SelectItem(cd));
        }
        return this.listaDoSelectItem;
    }

Quando executo a aplicação e escolho o estado acontece o seguinte erro

javax.faces.FacesException: #{diariaBean.popularCidades}: javax.el.MethodNotFoundException: /paginas/usuario/admin/diarias/eRDiaria2.xhtml @28,157 action="#{diariaBean.popularCidades}": Method not found: [email removido]()
	com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:99)
	javax.faces.component.UICommand.broadcast(UICommand.java:383)
	org.ajax4jsf.component.AjaxActionComponent.broadcast(AjaxActionComponent.java:55)
	org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:324)
	org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:299)
	org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:256)
	org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:469)
	com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
	com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)

Quem souber uma solução agradeceria muito pois estou a quase um mês neste problema. Desde já agradeço a ajuda.

8 Respostas

D

action não precisa ter o get na frente. O nome do método fica só public String popularCidades(){…}

ps. O erro fala exatamente isso: “#{diariaBean.popularCidades}: javax.el.MethodNotFoundException:”

C

duducordeiro_:
action não precisa ter o get na frente. O nome do método fica só public String popularCidades(){…}

ps. O erro fala exatamente isso: “#{diariaBean.popularCidades}: javax.el.MethodNotFoundException:”

Olá dudu

o erro avax.el.MethodNotFoundException: foi consertado era isso mesmo, porém, o combobox popularCidades ainda não está trazendo as cidades do estado escolhido. Notei que a página e renderizada mas as cidades não sao puxadas.

E

Tenta colocar o a4j:region sobre os dois combos.

E no lugar de :

<f:selectItems value="#{diariaBean.listaDoSelectItem}"/>

tenta colocar

<f:selectItems value="#{diariaBean.popularCidades}"/>

E tira o action do a4j:support.

D

Faz o que o evefuji falou e coloca em modo debug no método que deveria retornar a lista de cidades para ver o que está acontecendo.

C

evefuji:
Tenta colocar o a4j:region sobre os dois combos.

E no lugar de :

<f:selectItems value="#{diariaBean.listaDoSelectItem}"/>

tenta colocar

<f:selectItems value="#{diariaBean.popularCidades}"/>

E tira o action do a4j:support.

evefuji coloquei o a4j:region e coloquei o <f:selectItems value="#{diariaBean.popularCidades}"/> só que quando fiz isso deu esse erro:

javax.el.PropertyNotFoundException: /paginas/usuario/admin/diarias/eRDiaria2.xhtml @33,86 value="#{diariaBean.popularCidades}": Property 'popularCidades' not found on type br.aesa.control.bean.DiariaBean
	com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:73)
	javax.faces.component.UISelectItems.getValue(UISelectItems.java:130)
	com.sun.faces.renderkit.RenderKitUtils.getSelectItems(RenderKitUtils.java:323)
	com.sun.faces.renderkit.html_basic.MenuRenderer.getOptionNumber(MenuRenderer.java:675)
	com.sun.faces.renderkit.html_basic.MenuRenderer.renderSelect(MenuRenderer.java:793)
	com.sun.faces.renderkit.html_basic.MenuRenderer.encodeEnd(MenuRenderer.java:335)

Eu desconfiei que ia da um erro parecido com esse pelo seguinte motivo o popularCidades é uma lista que teria como função apenas popular o combobox com as cidades e não salvar o valor que no caso era pra ser feito pelo <f:selectItems value="#{diariaBean.listaDoSelectItem}"/> . Colocando o listaDosSelectItem parou de da o erro porém continua na mesma.

segue as modificações que eu fiz

<a4j:region>
                            <h:selectOneMenu id="comboEstado" value="#{diariaBean.estado.uf}" >
                                <f:selectItems value="#{diariaBean.popularEstados}"/>
                                <a4j:support event="onchange" ajaxSingle="true"  reRender ="comboEstado,comboCidades"/>
                            </h:selectOneMenu>
                            <h:outputText value="Cidade: "/>
                            <h:selectOneMenu id="comboCidades" value="#{diariaBean.cidade.nome}">
                                <f:selectItems value="#{diariaBean.popularCidades}"/>
                            </h:selectOneMenu>
                            </a4j:region>

Bom fiz o debug e ele me traz todos os estados e cidades cadastradas, ele so não ta carregando no combobox da cidade. Notei também que quando a aplicação chega nesse módulo os 2 combobox aparecem com as UF’s dos estados que na prática era pra mostar um do estado e outro da cidade.

E

esqueci de falar, no caso, como deixou de ser um action e passou a ser um getter, teria que mudar o nome para getPopularCidades

C

Problema resolvido so faltou colocar ele no get denovo.

Mto obrigado evefuji e duducordeiro_ pela grande ajuda.

webdiferente
Boa Tarde gujs...JA postei meu problema num parecido com este ...ja faz 10 dias queestou tentando faser com que o
<a4j:support event="onchange"  action="#{ControlaEndereco.actionCarregaBairros}" reRender="cidade,bairro" />
Funcione e nada ... alguem poderia me da uma luz para ver onde estou errando....se ajudado para ajudar e o loop continua...
<h:outputLabel for="cidade" value="Cidade " />

    <h:selectOneMenu id="cidade" value="#{ControlaEndereco.cidade}" >
        <f:selectItem itemValue="" itemLabel="Selecione..." />
        <f:selectItems value="#{ControlaEndereco.cidades}" />
        <a4j:support event="onchange"  action="#{ControlaEndereco.actionCarregaBairros}" reRender="cidade,bairro" />

    </h:selectOneMenu>

    <h:outputLabel for="bairro" value="Bairro" />
    <h:selectOneMenu id="bairro" value="#{ControlaEndereco.bairro.codBairro}">
        <f:selectItem itemValue="" itemLabel="Selecione..." />
        <f:selectItems value="#{ControlaEndereco.bairros}" />
    </h:selectOneMenu>
Criado 25 de agosto de 2011
Ultima resposta 19 de nov. de 2011
Respostas 8
Participantes 4