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)

Reply via email to