selectItems+ajax4jsf
gllambi Dec 7, 2006 11:25 AMI'm trying the new selectItems tag and had some problems with it when I tried to use it with ajax4jsf.
I have two combos boxes. When the first is changed, the second one must refresh with new values. The problem is that when the first combo changes a Ilegal State Exception occurs.
Here is the jsp
<h:panelGrid id="panelGrid" columns="2">
 <h:outputText id="etiquetaUsuario" value="#{msg.socio}" />
 <s:decorate>
 <h:inputText id="inputUsuario" value="#{cliente.usuario}" size="30">
 <a4j:support id="soporteAjaxUsuario" event="onblur"
 reRender="errorUsuario" />
 </h:inputText>
 <a4j:outputPanel id="errorUsuario" styleClass="error">
 <s:message id="mensajeErrorUsuario" />
 </a4j:outputPanel>
 </s:decorate>
 <h:outputText id="etiquetaContraseña" value="#{msg.contraseña}" />
 <s:decorate>
 <h:inputText id="inputContraseña" value="#{cliente.pwd}" size="30">
 <a4j:support id="soporteAjaxContraseña" event="onblur"
 reRender="errorPassword" />
 </h:inputText>
 <a4j:outputPanel id="errorPassword" styleClass="error">
 <s:message id="mensajeErrorContraseña" />
 </a4j:outputPanel>
 </s:decorate>
 <h:outputText id="etiquetaPais" value="#{msg.pais}" />
 <h:selectOneMenu id="seleccionarPais"
 converter="#{registro.countryConverter}" required="true"
 value="#{cliente.country}">
 <si:selectItems value="#{paises}" var="pais"
 label="#{pais.countryCode}"
 noSelectionLabel="#{msg.selecionePais}" hideNoSelection="true"></si:selectItems>
 <a4j:support id="soporteAjaxPais" event="onchange"
 reRender="seleccionarEstado" />
 </h:selectOneMenu>
 <h:outputText id="etiquetaEstado" value="#{msg.estado}" />
 <h:selectOneMenu id="seleccionarEstado"
 converter="#{registro.stateConverter}" value="#{cliente.state}"
 required="true">
 <si:selectItems value="#{estados}" var="estado"
 label="#{estado.stateCode}"
 noSelectionLabel="#{msg.seleccioneEstado}" hideNoSelection="true"></si:selectItems>
 </h:selectOneMenu>
</h:panelGrid>
<a4j:commandButton id="botonAjax" value="Ajax #{msg.registrarse}"
 action="#{registro.registrarse}"
 reRender="formRegistro:mensajesErrorPanel"></a4j:commandButton>
Here is the bean asociated with the page.
/**
 *
 */
package org.seam.ejemplo.validaciones.session;
import java.util.List;
import javax.ejb.Stateless;
import javax.faces.convert.Converter;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Factory;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.core.FacesMessages;
import org.jboss.seam.log.Log;
import org.jboss.seam.selectitems.jsf.EntityConverter;
import org.seam.ejemplo.validaciones.beans.Cliente;
import org.seam.ejemplo.validaciones.beans.Country;
import org.seam.ejemplo.validaciones.beans.State;
/**
 * @author gllambi
 *
 */
@Stateless
@Name("registro")
@Scope(ScopeType.EVENT)
public class RegistroImpl implements Registro {
 @PersistenceContext
 private EntityManager em;
 @Logger
 private Log log;
 @In
 private Cliente cliente;
 public String registrarse() {
 log.info("Registrando al cliente...");
 List existing = em.createQuery(
 "select usuario from Cliente where usuario=:usuarioParam")
 .setParameter("usuarioParam", cliente.getUsuario())
 .getResultList();
 if (!existing.isEmpty()) {
 log.info("Ya existe!");
 FacesMessages.instance().add("El usuario ya existe: #{cliente.usuario}");
 return null;
 }else{
 em.persist(cliente);
 log.info("Se registró un cliente nuevo: #{cliente.usuario} #{cliente.pwd}");
 return "exito";
 }
 }
 @Factory("paises")
 public List obtenerPaises() {
 List paises = em.createQuery("from Country").getResultList();
 log.info("Hay "+paises.size()+" países.");
 return paises;
 }
 public void cambiarEstados(){
 log.info("Cambio los estados");
 }
 @Factory("estados")
 public List obtenerEstados() {
 List estados;
 if ((cliente!= null)&&(cliente.getCountry()!=null)){
 estados = em.createQuery("from State where country_id=:countryParam").
 setParameter("countryParam", cliente.getCountry().getCountryId()).getResultList();
 log.info("Hay "+estados.size()+" estados.");
 }
 else estados = em.createQuery("from State").getResultList();
 return estados;
 }
 public Converter getCountryConverter() {
 return new EntityConverter<Country>(){
 @Override
 protected Object getIdAsObject(String id, Class arg1) {
 return Integer.valueOf(id);
 }
 @Override
 protected String getIdAsString(Country entity) {
 return String.valueOf(entity.getCountryId());
 }
 };
 }
 public Converter getStateConverter() {
 return new EntityConverter<State>(){
 @Override
 protected Object getIdAsObject(String id, Class clazz) {
 return Integer.valueOf(id);
 }
 @Override
 protected String getIdAsString(State entity) {
 return String.valueOf(entity.getStateId());
 }
 };
 }
}
Here is the log
2006-12-07 16:19:52,431 DEBUG [org.ajax4jsf.framework.renderer.AjaxContainerRenderer] Render Ajax Area component with ID :formRegistro:seleccionarEstado
2006-12-07 16:19:52,431 DEBUG [org.jboss.seam.jsf.SeamVariableResolver] resolving name: registro
2006-12-07 16:19:52,431 ERROR [org.apache.myfaces.lifecycle.PhaseListenerManager] Exception in PhaseListener RENDER_RESPONSE(6) afterPhase
javax.faces.el.EvaluationException: Cannot get value for expression '#{registro.stateConverter}'
 at org.apache.myfaces.el.ValueBindingImpl.getValue(ValueBindingImpl.java:402)
 at javax.faces.component.UIOutput.getConverter(UIOutput.java:65)
 at org.jboss.seam.selectitems.ui.UISeamSelectItems.addConverters(UISeamSelectItems.java:297)
 at org.jboss.seam.selectitems.ui.UISeamSelectItems.getValue(UISeamSelectItems.java:192)
 at org.apache.myfaces.shared_impl.util.SelectItemsIterator.hasNext(SelectItemsIterator.java:102)
 at org.apache.myfaces.shared_impl.renderkit.RendererUtils.internalGetSelectItemList(RendererUtils.java:477)
 at org.apache.myfaces.shared_impl.renderkit.RendererUtils.getSelectItemList(RendererUtils.java:453)
 at org.apache.myfaces.shared_impl.renderkit.html.HtmlRendererUtils.internalRenderSelect(HtmlRendererUtils.java:277)
 at org.apache.myfaces.shared_impl.renderkit.html.HtmlRendererUtils.renderMenu(HtmlRendererUtils.java:251)
 at org.apache.myfaces.shared_impl.renderkit.html.HtmlMenuRendererBase.encodeEnd(HtmlMenuRendererBase.java:54)
 at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:536)
 at org.ajax4jsf.framework.renderer.RendererBase.renderChild(RendererBase.java:249)
 at org.ajax4jsf.framework.renderer.AjaxContainerRenderer.encodeAjaxChild(AjaxContainerRenderer.java:197)
 at org.ajax4jsf.framework.renderer.AjaxContainerRenderer.encodeAjaxChild(AjaxContainerRenderer.java:190)
 at org.ajax4jsf.framework.renderer.AjaxContainerRenderer.encodeAjaxChild(AjaxContainerRenderer.java:190)
 at org.ajax4jsf.framework.renderer.AjaxContainerRenderer.encodeAjaxChild(AjaxContainerRenderer.java:190)
 at org.ajax4jsf.framework.renderer.AjaxContainerRenderer.encodeAjax(AjaxContainerRenderer.java:126)
 at org.ajax4jsf.framework.ajax.AjaxViewRoot.encodeAjax(AjaxViewRoot.java:570)
 at org.ajax4jsf.framework.ajax.AjaxContext.renderAjaxRegion(AjaxContext.java:260)
 at org.ajax4jsf.framework.renderer.AjaxPhaseListener.afterPhase(AjaxPhaseListener.java:96)
 at org.apache.myfaces.lifecycle.PhaseListenerManager.informPhaseListenersAfter(PhaseListenerManager.java:89)
 at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:391)
 at javax.faces.webapp.FacesServlet.service(FacesServlet.java:138)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
 at org.jboss.seam.servlet.SeamExceptionFilter.doFilter(SeamExceptionFilter.java:46)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
 at org.jboss.seam.servlet.SeamRedirectFilter.doFilter(SeamRedirectFilter.java:32)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
 at org.ajax4jsf.framework.ajax.xmlfilter.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:67)
 at org.ajax4jsf.framework.ajax.xmlfilter.BaseFilter.doFilter(BaseFilter.java:223)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
 at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
 at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175)
 at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
 at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
 at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
 at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
 at java.lang.Thread.run(Thread.java:595)
Caused by: java.lang.IllegalStateException: No application context active
 at org.jboss.seam.Component.forName(Component.java:1534)
 at org.jboss.seam.Component.getInstance(Component.java:1584)
 at org.jboss.seam.Component.getInstance(Component.java:1567)
 at org.jboss.seam.jsf.SeamVariableResolver.resolveVariable(SeamVariableResolver.java:45)
 at org.apache.myfaces.config.LastVariableResolverInChain.resolveVariable(LastVariableResolverInChain.java:42)
 at org.apache.myfaces.el.ValueBindingImpl$ELVariableResolver.resolveVariable(ValueBindingImpl.java:574)
 at org.apache.commons.el.NamedValue.evaluate(NamedValue.java:124)
 at org.apache.commons.el.ComplexValue.evaluate(ComplexValue.java:140)
 at org.apache.myfaces.el.ValueBindingImpl.getValue(ValueBindingImpl.java:383)
 ... 50 more
2006-12-07 16:19:52,431 DEBUG [org.ajax4jsf.framework.DebugLifecycle] End phase RENDER_RESPONSE(6)
2006-12-07 16:19:52,431 DEBUG [org.jboss.seam.util.Naming] JNDI InitialContext properties:{java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory, java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces}
2006-12-07 16:19:52,431 DEBUG [org.jboss.seam.servlet.SeamExceptionFilter] ended request
2006-12-07 16:19:52,431 DEBUG [org.ajax4jsf.framework.ajax.xmlfilter.BaseFilter] Finished request processing total time 47ms for uri: /seam-validacion/view/registro.seam
Thanks a lot
Guzmán
 
     
    