Список выбора PrimeFaces с OmniFaces validateAll приводит к исключению NullPointerException - PullRequest
0 голосов
/ 22 февраля 2019

То, что я на самом деле хочу, это два PrimeFaces <p:pickList> s, которые будут проверены с OmniFaces '<o:validateAll> компонентом.Обратите внимание, что проверка pickList с <o:validateAll> имеет проблему, которая может быть решена как , описанный в выпуске 488 в трекере проблем OmniFaces.

Итак, очень простой пример моего требования выглядиткак это:

<h:form id="form1">
  <p:messages id="messages">
    <p:autoUpdate/>
  </p:messages>

  <p:pickList id="pick1" value="#{dummy.dualListModel}"
              var="item" itemLabel="#{item}" itemValue="#{item}">
    <p:ajax event="transfer"/>
  </p:pickList>

  <p:pickList id="pick2" value="#{dummy.dualListModel2}"
              var="item" itemLabel="#{item}" itemValue="#{item}">
    <p:ajax event="transfer"/>
  </p:pickList>

  <o:validateAll id="validPicks" components="pick1 pick2"
                 message="all values required!" />

  <h:commandButton id="done" value="Done" action="#{dummy.action1}"/>
</h:form>

<h:form id="theOtherForm">
  <h:commandButton id="otherFormAction" value="Action in other form"
                   action="#{dummy.action2}"/>
</h:form>

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

1019 * *1019* 1019 * *1019* Когда я запускаю этот код и оставляю хотя бы один список выбора пустым, отправка кнопки Done вызывает ошибку проверки, как это было исключено.Однако нажатие кнопки в другой форме после сбоя проверки приводит к значению NullPointerException в PickListRenderer.Вот StackTrace:

Caused by:java.lang.NullPointerException
    at org.primefaces.component.picklist.PickListRenderer.encodeMarkup(PickListRenderer.java:92)
    at org.primefaces.component.picklist.PickListRenderer.encodeEnd(PickListRenderer.java:59)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:920)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1863)
    at javax.faces.render.Renderer.encodeChildren(Renderer.java:176)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:890)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:456)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:134)
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337)
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337)
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337)
    at org.omnifaces.viewhandler.OmniViewHandler.renderView(OmniViewHandler.java:119)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
    [...]

Я использую OmniFaces 2.7 и PrimeFaces 6.2.

Обратите внимание , что я использую пользовательский рендер для PickList, который переопределяетgetConvertedValue(), как описано в связанном выпуске сверху.Однако это никоим образом не изменяет поведение рендерера, что должно повлиять на эту ошибку.Это просто заставляет <o:validateAll> признать, что pickList пуст.

Мне кажется, что это ошибка, но я не уверен, что это ошибка в OmniFaces или в PrimeFaces.Кто-нибудь есть идеи?

Обходной путь

В качестве обходного пути можно добавить атрибут required="true" ко всем спискам выбора.

Обновление

То же самоепроблема существует с PrimeFaces 7.0 (только номера строк немного отличаются).

Кроме того, я создал еще один NPE с вышеуказанным кодом и PrimeFaces 7.0, когда для добавления пустых списков выбора с помощью «done» и переноса элемента в одинсписка выбора для списка целей.

Здесь возникает другое исключение:

Caused by:java.lang.NullPointerException
    at org.primefaces.component.picklist.PickList.validateValue(PickList.java:140)
    at javax.faces.component.UIInput.validate(UIInput.java:982)
    at org.primefaces.component.picklist.PickList.validate(PickList.java:181)
    at javax.faces.component.UIInput.executeValidate(UIInput.java:1248)
    at javax.faces.component.UIInput.processValidators(UIInput.java:712)
    at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:575)
    at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:183)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1689)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
    at javax.faces.component.UIForm.visitTree(UIForm.java:371)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
    at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:403)
    at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:266)
    at org.primefaces.context.PrimePartialViewContext.processPartial(PrimePartialViewContext.java:63)
    at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:219)
    at org.omnifaces.context.OmniPartialViewContext.processPartial(OmniPartialViewContext.java:124)
    at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1193)
    at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)

В соответствующем коде , значение oldModel, которое инициализируетсячерез getValue() есть null.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

Как писал Melloware , проблема была зарегистрирована как Проблема PrimeFaces # 4756 .Оказалось, что проблема существует только с Mojarra (протестировано с 2.2.17, 2.2.18, 2.2.19 и 2.3.9), а не с MyFaces.Итак, еще одна проблема была создана: Мохарра # 4398 .

0 голосов
/ 26 апреля 2019

Проблема проверена и сообщена на GitHub: https://github.com/primefaces/primefaces/issues/4756

Я отправил исправление, которое, надеюсь, будет включено в PF 7.0.2 и PF 7.1

https://github.com/primefaces/primefaces/pull/4759

...