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