SelectOneMenu não pode receber uma Map, quando possui um evento?

0 respostas
Emeyer

Olá Galera,

Sou iniciante em JSF e estou com uma dúvida. Estou usando o JSF 1.1 e tenho uma pág. jsp com duas combos
a segunda é populada de acordo com a seleção da primeira. Ambas as combos, tenho os getters que retornam as Maps. Na 2ª combo, tenho um evento “onchange”, e nessa combo, ao alterar o valor me acusa um erro. Eu troquei o tipo de retorno da 1ª combo para uma List<SelectItem>, ao qual funcionou (conforme verifiquei em outros msgs desse forúm). Minha dúvida é: Quando tenho um evento amarrado numa <h:SelectOneMenu>, não posso usar Map somente List/SelectItem, talvez devido algum bug da versão JSF 1.1?

Código ManagedBean:

<faces-config>

<managed-bean>

<managed-bean-name>CombosMB</managed-bean-name>

<managed-bean-class>

br.com.bean.mb.CombosMB

</managed-bean-class>

<managed-bean-scope>session</managed-bean-scope>

</managed-bean>

</faces-config>

Código Java
package br.com.bean.mb;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;
import javax.faces.context.FacesContext;

import javax.faces.event.ValueChangeEvent;

import javax.faces.model.SelectItem;

/**

  • @author OTTA9FM
    */
    public class CombosMB {

    //private Map<String, String> comidas = new HashMap<String, String>();
    
    private List<SelectItem> comidas = new ArrayList<SelectItem>();
    
    private Map<String, String> bebidasMassas = new HashMap<String, String>();
    
    private Map<String, String> bebidasSanduiches = new HashMap<String, String>();
    
    private Map bebidas = new HashMap();	
    
    private String comidaSelecionadaId;
    
    private String bebidaSelecionadaId;
    
    /**
    
    • Default Constructor
      
      */
      
      public CombosMB() {
      
      <a href="//comidas.put">//comidas.put</a>(“Massa”,“1”);
      
      <a href="//comidas.put">//comidas.put</a>(“Sanduiches”,“2”);
      
      comidas.add(new SelectItem(“1”, “Massa”));
      
      comidas.add(new SelectItem(“2”, “Sanduíche”));
      
      //Bebidas Massas
      
      bebidasMassas.put(“Vinho Branco”,“1”);
      
      bebidasMassas.put(“Vinho Tinto”, “2”);
      
      bebidasMassas.put(“Suco”, “3”);
      
      bebidasMassas.put(“Refrigerante”, “4”);
      
      //Bebidas Sanduiches
      
      bebidasSanduiches.put(“Refrigerante”, “1”);
      
      bebidasSanduiches.put(“Cerveja”, “2”);
      
      bebidasSanduiches.put(“Chop”, “3”);
      

      setBebidasForComida(“1”);

    }

    //public void setComidas(Map<String, String> comidas){ this.comidas = comidas; }
    
    //public Map<String, String> getComidas(){ return this.comidas; }
    
    public void setComidas(List<SelectItem> comidas){ this.comidas = comidas; }
    
    public List<SelectItem> getComidas(){ return this.comidas; }
    
    public void setBebidas(Map bebidas){ this.bebidas = bebidas; }
    
    public Map getBebidas(){ return bebidas; }
    
    public String getComidaSelecionadaId() {
    
    return comidaSelecionadaId;
    
    }
    
    public void setComidaSelecionadaId(String comidaSelecionadaId) {
    
    this.comidaSelecionadaId = comidaSelecionadaId;
    
    }
    
    public String getBebidaSelecionadaId() {
    
    return bebidaSelecionadaId;
    
    }
    
    public void setBebidaSelecionadaId(String bebidaSelecionadaId) {
    
    this.bebidaSelecionadaId = bebidaSelecionadaId;
    
    }
    
    public void selecionarBebidas(ValueChangeEvent valueChangeEvent){
    
    setBebidasForComida((String) valueChangeEvent.getNewValue());
    
    FacesContext.getCurrentInstance().renderResponse();
    
    }
    
    private void setBebidasForComida(String comidaSelecionada){		
    
    if(comidaSelecionada.equals(1))
    
    this.setBebidas(bebidasMassas);
    
    if(comidaSelecionada.equals("2"))
     	this.setBebidas(bebidasSanduiches);
    

    }
    }

Código JSF

…

<h:outputLabel value=“Selecione seu prato” for=“comidas” />

<h:selectOneMenu id=“comidas” value="#{CombosMB.comidaSelecionadaId}"

onchange=“submit()” immediate=“true”

valueChangeListener="#{CombosMB.selecionarBebidas}">

<f:selectItems value="#{CombosMB.comidas}"/>

</h:selectOneMenu>
<h:outputLabel value=“Selecione sua bebida” for=“bebidas” />

<h:selectOneMenu id=“bebidas”

value="#{CombosMB.bebidaSelecionadaId}">

<f:selectItems value="#{CombosMB.bebidas}" />

</h:selectOneMenu><h:messages layout=“table” />
Código do Erro:

Dec 18, 2007 9:23:26 AM org.apache.catalina.core.StandardWrapperValve invoke

SEVERE: Servlet.service() for servlet Faces Servlet threw exception

java.lang.IllegalArgumentException

at javax.faces.component.SelectItemsIterator.next(SelectItemsIterator.java:124)

at javax.faces.component.UISelectOne.matchValue(UISelectOne.java:141)

at javax.faces.component.UISelectOne.validateValue(UISelectOne.java:114)

at javax.faces.component.UIInput.validate(UIInput.java:634)

at javax.faces.component.UIInput.executeValidate(UIInput.java:838)

at javax.faces.component.UIInput.processDecodes(UIInput.java:383)

at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:872)

at javax.faces.component.UIForm.processDecodes(UIForm.java:144)

at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:872)

at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:306)

at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:79)

at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)

at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:90)

at javax.faces.webapp.FacesServlet.service(FacesServlet.java:197)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)

at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)

at java.lang.Thread.run(Unknown Source)
Criado 18 de dezembro de 2007
Respostas 0
Participantes 1