Я использую primefaces-6.0, mojarra-2.2.12 и wildfly-8,2. Моя цель - добавить динамический динамик columnresize для динамического использования, используя прослушиватель prerenderview. Это решение работает нормально, когда нет прослушивателя ajax ранее. Но если в datatable есть какие-либо другие прослушиватели ajax (скажем, rowselect), и слушатель изменения размера добавляется с помощью прослушивателя prerenderview, я получаю исключение нулевого указателя в реализации JSF, когда я пытаюсь обновить обработанный datatable.Не можете добавить новое поведение Аякса primefaces DataTable динамически, когда он уже есть слушатели добавили в XHTML
код XHTML:
<f:event type="preRenderView" listener="#{datatableTestBean.onPreRenderViewEvent()}"/>
<p:panelGrid>
<p:row>
<p:column>
<p:commandButton value="refersh datatable" actionListener="#{datatableTestBean.refershAll()}" update="-frm3"/>
</p:column>
</p:row>
<p:row>
<p:column>
<p:dataTable id="scrolltestdt" value="#{datatableTestBean.dtValues}" var="row"
resizableColumns="true" liveResize="false" resizeMode="expand"
scrollable="true" scrollHeight="400" selectionMode="single" rowKey="#{row}">
<p:ajax event="rowSelect" listener="#{datatableTestBean.onRowSelected()}"/>
<p:column filterBy="#{row[0]}" headerText="COlumn1" >
<h:outputText value="#{row[0]}"/>
</p:column>
<p:column filterBy="#{row[1]}" headerText="COlumn2">
<h:outputText value="#{row[1]}" />
</p:column>
</p:dataTable>
</p:column>
</p:row>
CDI код фасоли:
int tmp = 0;
public void onPreRenderViewEvent() {
if (tmp == 0) {
System.out.println("onPreRenderViewEvent");
DataTable table = (DataTable) FacesContext.getCurrentInstance().getViewRoot().findComponent("frm3-scrolltestdt");
addColumnResizeListenerToDatatable(table);
tmp = 1;
}
}
private void addColumnResizeListenerToDatatable(DataTable table) {
FacesContext fc = FacesContext.getCurrentInstance();
ExpressionFactory ef = fc.getApplication().getExpressionFactory();
MethodExpression me = ef.createMethodExpression(fc.getELContext(), "#{datatableTestBean.onResize}", Object.class, new Class[]{ColumnResizeEvent.class});
AjaxBehavior columnResizeEvent = (AjaxBehavior) fc.getApplication().createBehavior(AjaxBehavior.BEHAVIOR_ID);
columnResizeEvent.addAjaxBehaviorListener(new AjaxBehaviorListenerImpl(me, me));
table.addClientBehavior("colResize", columnResizeEvent);
}
Эта ошибка приходит, когда я обновить форму с помощью кнопки управления.
журнала:
[javax.enterprise.resource.webcontainer.jsf.context] (default task-54) 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.UIData.restoreState(UIData.java:1750)
at org.primefaces.component.api.UIData.restoreState(UIData.java:1311)
at com.sun.faces.application.view.FaceletPartialStateManagementStrategy$2.visit(FaceletPartialStateManagementStrategy.java:379)
at com.sun.faces.component.visit.FullVisitContext.invokeVisitCallback(FullVisitContext.java:151)
at org.primefaces.component.api.UIData.visitTree(UIData.java:827)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
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.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 javax.faces.application.ViewHandlerWrapper.restoreView(ViewHandlerWrapper.java:353)
at javax.faces.application.ViewHandlerWrapper.restoreView(ViewHandlerWrapper.java:353)
at org.omnifaces.viewhandler.OmniViewHandler.restoreView(OmniViewHandler.java:100)
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)
at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:130)
at io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:129)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132)
at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:85)
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61)
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:56)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45)
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:63)
at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58)
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70)
at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:261)
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:247)
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:76)