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