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)