2017-01-02 4 views
1

Я использую 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) 

ответ

0

У меня была такая же проблема при попытке добавить ajaxBehavior в onPreRenderViewEvent слушателя.

Попробуйте сделать это в слушателе

<f:event type="postAddToView" listner="#{listner}"> 

Это работает для меня.

Смежные вопросы