Validation Error on Simple a4j:support Call
jasontc Jun 19, 2007 10:19 AMI am trying to add an a4j call to an existing Faces form. I am getting two errors and not sure if the are related.
The errors:
[6/19/07 8:59:21:958 CDT] 00000025 jsf E com.sun.faces.context.FacesContextImpl addMessage Adding Message[sourceId=docedit:tier1,summary=Validation Error: Value is not valid) [6/19/07 8:59:21:958 CDT] 00000025 ServletWrappe E SRVE0068E: Could not invoke the service() method on servlet FacesServlet. Exception thrown : java.lang.StringIndexOutOfBoundsException: String index out of range: 0 at java.lang.String.charAt(String.java(Compiled Code)) at org.ajax4jsf.framework.ajax.AjaxContext.convertId(AjaxContext.java:698) at org.ajax4jsf.framework.ajax.AjaxContext.addRegionsFromComponent(AjaxContext.java:683) at org.ajax4jsf.framework.ajax.AjaxActionComponent.setupReRender(AjaxActionComponent.java:72) at org.ajax4jsf.framework.ajax.AjaxActionComponent.broadcast(AjaxActionComponent.java:51) at org.ajax4jsf.framework.ajax.AjaxViewRoot.processEvents(AjaxViewRoot.java:180) at org.ajax4jsf.framework.ajax.AjaxViewRoot.broadcastAjaxEvents(AjaxViewRoot.java:198) at org.ajax4jsf.framework.ajax.AjaxViewHandler.processAjaxEvents(AjaxViewHandler.java:270) at org.ajax4jsf.framework.ajax.AjaxViewHandler.renderView(AjaxViewHandler.java:226) at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:87) at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:220) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:118) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:198) at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1282) at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1239) ...
The JSP where the form resides:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <%@ taglib uri="https://ajax4jsf.dev.java.net/ajax" prefix="a4j"%> ... <body> <f:view> ... <h:form id="docedit"> ... <fieldset><legend>Organization & Functional Information</legend> <label for="docedit:tier1">Tier 1:</label> <a4j:region selfRendered="true"> <h:selectOneMenu id="tier1" value="#{pc_DocumentEdit.selectedTier1}" required="false" styleClass="input-width-dropdown-reg"> <f:selectItems value="#{pc_DocumentEdit.referenceTier1}"/> <a4j:support event="onchange" action="#{pc_DocumentEdit.tier1Change}" ajaxSingle="true" reRender="" immediate="false" /> </h:selectOneMenu> </a4j:region> <br/> </fieldset> <h:commandButton type="submit" id="docupdate" action="#{pc_DocumentEdit.update}" value="Save Document"/> </h:form> ... </f:view> </body> </html>
I have the following in my faces-config.xml file:
<managed-bean> <managed-bean-name>pc_TiersAndLevels</managed-bean-name> <managed-bean-class>TiersAndLevels</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> <managed-bean> <managed-bean-name>pc_DocumentEdit</managed-bean-name> <managed-bean-class>DocumentEdit</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> <managed-property> <property-name>docid</property-name> <value>#{param.docid}</value> </managed-property> <managed-property> <property-name>tiersAndLevels</property-name> <property-class>TiersAndLevels</property-class> <value>#{pc_TiersAndLevels}</value> </managed-property> </managed-bean>
And the important parts of the backing bean:
/* * Auto-generated by AppFactory tool on Mon Jun 11 12:32:46 CDT 2007 * */ import java.sql.SQLException; import java.util.ArrayList; import javax.faces.model.SelectItem; import PageCodeBase; import Util; public class DocumentEdit extends PageCodeBase { //Member variables private DocumentBean documentBean; private SelectItem[] referenceTypes; private SelectItem[] referenceStatuses; private SelectItem[] referenceMonths; /* * Tier and Level Stuff */ private TiersAndLevels tiersAndLevels; private SelectItem[] referenceTier1; private String selectedTier1; private String docid; public DocumentEdit() { documentBean = new DocumentBean(); } ... /* * @return Returns the referenceTier1. */ public SelectItem[] getReferenceTier1() { if (referenceTier1 == null) { referenceTier1 = new SelectItem[1]; ArrayList tiers = getTiersAndLevels().getTier1List(); if ((tiers != null) && (tiers.size() > 0)) { referenceTier1 = new SelectItem[tiers.size() + 1]; for (int i = 0; i < tiers.size(); i++) { referenceTier1[i + 1] = new SelectItem(((TierRefBean) tiers .get(i)).getTierIk(), ((TierRefBean) tiers .get(i)).getTierName()); } referenceTier1[0] = new SelectItem("-1", ">> Select Tier <<"); } } return referenceTier1; } /** * @param referenceTier1 The referenceTier1 to set. */ public void setReferenceTier1(SelectItem[] referenceTier1) { this.referenceTier1 = referenceTier1; } /** * @return Returns the selectedTier1. */ public String getSelectedTier1() { return selectedTier1; } /** * @param selectedTier1 The selectedTier1 to set. */ public void setSelectedTier1(String selectedTier1) { System.out.println("JASON >>> DocumentEdit.setSelectedTier1: " + selectedTier1); this.selectedTier1 = selectedTier1; } public String tier1Change() { System.out.println("JASON >>> DocumentEdit.tier1Change >>> Selected Tier1: " + selectedTier1); return null; } /** * @return Returns the tiersAndLevels. */ public TiersAndLevels getTiersAndLevels() { return tiersAndLevels; } /** * @param tiersAndLevels The tiersAndLevels to set. */ public void setTiersAndLevels(TiersAndLevels tiersAndLevels) { this.tiersAndLevels = tiersAndLevels; } }
Thanks in advance for any help.