Gordon Freeman created MYFACES-4716:
---------------------------------------
Summary: Ajax is not working for empty selection for
h:selectManyListbox
Key: MYFACES-4716
URL: https://issues.apache.org/jira/browse/MYFACES-4716
Project: MyFaces Core
Issue Type: Bug
Affects Versions: 4.0.2
Reporter: Gordon Freeman
I have multiselect on the form:
{code}
<h:selectManyListbox id="someId" value="#{myBackingBean.valueList}">
<f:selectItems value="${myBackingBean.valueSelectItems}" />
<f:ajax execute="@this" render="someOtherId" event="valueChange"
listener="#{myBackingBean.valueChanged}"/>
</h:selectManyListbox>
{code}
When I deselect the last option in the multiselect I expect the empty list to
be setted to the backing bean _valueList_ and the _valueChanged_ method to be
called.
But the _valueChanged_ method is not called and a crash occurs at the
validation stage due to NPE.
{code}
org.apache.myfaces.core.api.shared.SelectItemsUtil.matchValue(SelectItemsUtil.java:235)
jakarta.faces.component.UISelectMany.validateValue(UISelectMany.java:332)
jakarta.faces.component.UIInput.validate(UIInput.java:717)
jakarta.faces.component.UIInput.processValidators(UIInput.java:297)
org.apache.myfaces.context.servlet.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:717)
org.apache.myfaces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:226)
jakarta.faces.component.UIComponent.visitTree(UIComponent.java:880)
jakarta.faces.component.UIComponentBase.visitTree(UIComponentBase.java:1120)
jakarta.faces.component.UIComponent.visitTree(UIComponent.java:908)
jakarta.faces.component.UIComponentBase.visitTree(UIComponentBase.java:1120)
jakarta.faces.component.UIComponent.visitTree(UIComponent.java:908)
jakarta.faces.component.UIComponentBase.visitTree(UIComponentBase.java:1120)
jakarta.faces.component.UIComponent.visitTree(UIComponent.java:908)
jakarta.faces.component.UIComponentBase.visitTree(UIComponentBase.java:1120)
jakarta.faces.component.UIComponent.visitTree(UIComponent.java:908)
jakarta.faces.component.UIComponentBase.visitTree(UIComponentBase.java:1120)
jakarta.faces.component.UIForm.visitTree(UIForm.java:343)
jakarta.faces.component.UIComponent.visitTree(UIComponent.java:908)
jakarta.faces.component.UIComponentBase.visitTree(UIComponentBase.java:1120)
org.apache.myfaces.context.servlet.PartialViewContextImpl.processPartialExecute(PartialViewContextImpl.java:407)
org.apache.myfaces.context.servlet.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:388)
jakarta.faces.component.UIViewRoot$ProcessValidatorPhaseProcessor.process(UIViewRoot.java:1857)
jakarta.faces.component.UIViewRoot._process(UIViewRoot.java:1714)
jakarta.faces.component.UIViewRoot.processValidators(UIViewRoot.java:972)
org.apache.myfaces.lifecycle.ProcessValidationsExecutor.execute(ProcessValidationsExecutor.java:39)
org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:172)
org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:125)
jakarta.faces.webapp.FacesServlet.service(FacesServlet.java:223)
{code}
According to the _HtmlRendererUtils.decodeUISelectMany_ method, when posting an
empty multiselect, no parameters for this multiselect should be sent to the
server.
But the parameter is sent - it is an empty string. It is filled in
_XhrRequest.ts_ when calling _this.appendIssuingItem(formData);_
I think this is a bug (probably introduced in MYFACES-4606) in js and with an
empty multiselect the parameter should not be sent in the POST request.
And the current behavior is as if an option with an empty value was selected in
the multiselect, _submittedValue_ is an array of one element - an empty string,
instead of empty array.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)