[
https://issues.apache.org/jira/browse/MYFACES-4716?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17938308#comment-17938308
]
Werner Punz edited comment on MYFACES-4716 at 3/25/25 6:03 PM:
---------------------------------------------------------------
The fix which supposed to opened the regression is from 2023, so it has been
two years and fixes a bigger issue, let me investigate and do not postpone the
release, we still can roll another one later! I do not want a revert on the
fix, I would rather have both issues fixed instead of just reverting the other
fix and then have a worse bug on my hands!
was (Author: werpu):
The fix which supposed to opened the regression is from 2023, so it has been
two years and fixes a bigger issue, let me investigate and do not postpone the
release, we still can roll another one later! I do not want a revert on the
fix, I would rather have both issues fixed!
> 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
> Assignee: Werner Punz
> Priority: Major
>
> 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)