Я пытаюсь прослушать событие от компонентов, содержащихся в DynaForm простых расширений-расширений, поэтому разработчик может динамически выполнять некоторые пользовательские действия. В конце я хотел бы иметь возможность сделать это:
<pe:dynaForm id="dynaForm" value="#{dynaFormController.model}" var="data" controlKey="#{data.name}">
<pe:dynaFormControl type="input" for="txt">
<p:inputText id="txt" value="#{data.value}" required="#{data.required}" />
</pe:dynaFormControl>
<my:ajax event="keyup" listener="#{controller.authorSelected}" key="author"/>
</pe:dynaForm>
Что я хочу сделать:
Всякий раз, когда ключ, определенный в my:ajax
, совпадает с controlKey pe:dynaFormControl
, я хочу присоединить поведение клиента my:ajax
к p:inputText
.
Возникли проблемы:
Сначала я сделал все это в DynaFormRenderer#encodeBody
, что очень удобно, поскольку var
помещен в контекст EL. Но в итоге я получил это исключение (похожее на это https://github.com/javaserverfaces/mojarra/issues/4365):
java.lang.NullPointerException
at javax.faces.component.UIComponentBase.restoreBehaviors(UIComponentBase.java:2228)
at javax.faces.component.UIComponentBase.restoreBehaviorsState(UIComponentBase.java:2203)
at javax.faces.component.UIComponentBase.restoreState(UIComponentBase.java:1623)
at javax.faces.component.UIOutput.restoreState(UIOutput.java:286)
at javax.faces.component.UIInput.restoreState(UIInput.java:1422)
at com.sun.faces.application.view.FaceletPartialStateManagementStrategy$2.visit(FaceletPartialStateManagementStrategy.java:379)
at com.sun.faces.component.visit.FullVisitContext.invokeVisitCallback(FullVisitContext.java:151)
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 com.sun.faces.application.view.FaceletPartialStateManagementStrategy.restoreView(FaceletPartialStateManagementStrategy.java:366)
at com.sun.faces.application.StateManagerImpl.restoreView(StateManagerImpl.java:138)
at com.sun.faces.application.view.ViewHandlingStrategy.restoreView(ViewHandlingStrategy.java:123)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.restoreView(FaceletViewHandlingStrategy.java:591)
at com.sun.faces.application.view.MultiViewHandler.restoreView(MultiViewHandler.java:151)
at javax.faces.application.ViewHandlerWrapper.restoreView(ViewHandlerWrapper.java:353)
at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:199)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:123)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
Затем я попытался сделать то же самое, что и o:moveComponent
из Omnifaces, используя PreRenderViewEvent, но var на данный момент недоступен, фактически, вызов DynaForm#getValue()
всегда возвращает null.
Есть ли у вас какие-либо предложения о том, как правильно подключить поведение клиента динамически, когда var
появляется на картинке?
Больше информации: Мохарра 2.2.15 и Tomcat 8