2012-09-01 54 views
0

我遇到了ICEFaces的問題。它似乎無法正確刷新視圖。
我會爲您提供視圖,流程,bean以及由於某些調試會話而發現的奇怪行爲的細節。ICEFaces 3.1:在重新呈現視圖時引發NullPointerException

基本上,我正在處理一個懶加載的ace:DataTable。

<ace:dataTable id="blocchiTable" [..] /> 

我選擇一些行,然後點擊標有「Modifica」(意爲「編輯」)按鈕:

<ace:menuItem id="modificaBloccoButton" value="Modifica" action="modificaBlocco" icon="ui-icon ui-icon-pencil" />` 

正如你將在流動看,相關點擊事件線索流向決策狀態:

<view-state id="creablocco" view="creablocco.xhtml"> 
    [.. other stuff ..] 
    <transition on="modificaBlocco" to="decidiModifica"> 
     <evaluate expression="flowScope.blocchiBean.getRigheSelezionate()" result="flowScope.righeSelezionate"/> 
    </transition> 
</view-state> 
<decision-state id="decidiModifica"> 
    <if test="!(flowScope.righeSelezionate).isEmpty()" then="modificaBlocco" else="fine" /> 
</decision-state> 

並且之後與另一視圖狀態相關聯的與初始狀態相同的視圖。在進入新的視圖狀態時,流程會要求bean爲適當的行啓用cellEditor,以便在重新呈現視圖時,所選行將是可編輯的。

<view-state id="modificaBlocco" view="creablocco.xhtml"> 
    <on-entry> 
     <evaluate expression="flowScope.blocchiBean.abilitaModifica()"/> 
    </on-entry>  
    <transition on="salvaModificheBlocco" to="fine"> 
     <evaluate expression="flowScope.blocchiBean.salvaBlocchi()"/> 
    </transition> 
</view-state> 

Unfortunaly,而重新呈現視圖(I已經檢查了在<on-entry>部分中指定的方法被實際調用的),以下異常升高:

AVVERTENZA: queued exception 
java.lang.NullPointerException 
    at org.icefaces.impl.util.DOMUtils.isWhitespaceText(DOMUtils.java:394) 
    at org.icefaces.impl.util.DOMUtils.printNode(DOMUtils.java:351) 
    at org.icefaces.impl.util.DOMUtils.printNode(DOMUtils.java:355) 
    at org.icefaces.impl.util.DOMUtils.printNode(DOMUtils.java:355) 
    at org.icefaces.impl.util.DOMUtils.printNode(DOMUtils.java:355) 
    at org.icefaces.impl.util.DOMUtils.printNode(DOMUtils.java:306) 
    at org.icefaces.impl.util.DOMUtils.printNode(DOMUtils.java:290) 
    at org.icefaces.impl.context.DOMResponseWriter.endDocument(DOMResponseWriter.java:225) 
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:410) 
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131) 
    at org.springframework.faces.webflow.FlowViewHandler.renderView(FlowViewHandler.java:99) 
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) 
    at org.springframework.faces.webflow.FlowLifecycle.render(FlowLifecycle.java:80) 
    at org.springframework.faces.webflow.JsfView.render(JsfView.java:89) 
    at org.springframework.webflow.engine.ViewState.render(ViewState.java:296) 
    at org.springframework.webflow.engine.ViewState.refresh(ViewState.java:243) 
    at org.springframework.webflow.engine.ViewState.resume(ViewState.java:221) 
    at org.springframework.webflow.engine.Flow.resume(Flow.java:545) 
    at org.springframework.webflow.engine.impl.FlowExecutionImpl.resume(FlowExecutionImpl.java:258) 
    at org.springframework.webflow.executor.FlowExecutorImpl.resumeExecution(FlowExecutorImpl.java:169) 
    at org.springframework.webflow.mvc.servlet.FlowHandlerAdapter.handle(FlowHandlerAdapter.java:183) 
    at org.springframework.faces.webflow.JsfFlowHandlerAdapter.handle(JsfFlowHandlerAdapter.java:48) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:900) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:311) 
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:116) 
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:101) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:182) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:173) 
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) 
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at com.springsource.insight.collection.tcserver.request.HttpRequestOperationCollectionValve.traceNextValve(HttpRequestOperationCollectionValve.java:112) 
    at com.springsource.insight.collection.tcserver.request.HttpRequestOperationCollectionValve.invoke(HttpRequestOperationCollectionValve.java:94) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:662) 

這是完整視圖

<?xml version="1.0"?> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
       xmlns:ui="http://java.sun.com/jsf/facelets" 
       xmlns:ace="http://www.icefaces.org/icefaces/components" 
       xmlns:ice="http://www.icesoft.com/icefaces/component" 
       xmlns:h="http://java.sun.com/jsf/html" 
       xmlns:f="http://java.sun.com/jsf/core" 
       template="/resources/includes/templates/template.xhtml"> 
    <ui:param name="pageTitle" value="Crea blocco" /> 
    <ui:define name="page-content"> 
     <ace:panel id="personalInfoInputPanel" header="Crea blocco"> 
      <div class="div_creablocco"> 
       <h:form id="creabloccoform"> 
        <h:panelGrid id="creabloccoInputGrid" columns="1" styleClass="table_creablocco"> 
         <ace:textEntry id="numeroFile" value="#{creaBloccoBean.numeroFile}" label="Numero file:" labelPosition="left" required="true" requiredIndicator="(*)" indicatorPosition="right"> 
         </ace:textEntry> 
         <ace:textEntry id="numeroColonne" value="#{creaBloccoBean.numeroColonne}" label="Numero colonne:" labelPosition="left" required="true" requiredIndicator="(*)" indicatorPosition="right"> 
         </ace:textEntry> 
         <ace:textEntry id="posizioneX" value="#{creaBloccoBean.posizioneX}" label="Coordinata X:" labelPosition="left" required="true" requiredIndicator="(*)" indicatorPosition="right"> 
         </ace:textEntry> 
         <ace:textEntry id="posizioneY" value="#{creaBloccoBean.posizioneY}" label="Coordinata Y:" labelPosition="left" required="true" requiredIndicator="(*)" indicatorPosition="right"> 
         </ace:textEntry> 
         <ace:pushButton id="pushBttnCreaBlocco" value="Crea blocco" action="creaBlocco"/> 
        </h:panelGrid> 
       </h:form> 
      </div> 
     </ace:panel> 

     <ace:panel id="blocchiPanel" header="Blocchi"> 
      <h:form id="blocchiTableForm"> 
       <ace:menuBar id="iconeBloccoMenu" rendered="#{!blocchiBean.modificaInCorso}"> 
        <ace:menuItem id="dettagliBloccoButton" value="Dettagli" action="dettagliBlocco" icon="ui-icon ui-icon-search" /> 
        <ace:menuItem id="modificaBloccoButton" value="Modifica" action="modificaBlocco" icon="ui-icon ui-icon-pencil" /> 
        <ace:menuItem id="cancellaBloccoButton" value="Cancella" action="cancellaBlocco" icon="ui-icon ui-icon-closethick" /> 
       </ace:menuBar> 
       <ace:menuBar id="iconeModificaBloccoMenu" rendered="#{flowScope.blocchiBean.modificaInCorso}"> 
        <ace:menuItem id="annullaModificheButton" value="Annulla" action="annullaModificheBlocco" icon="ui-icon ui-icon-arrow-1-w" /> 
        <ace:menuItem id="salvaModifiche" value="Salva" action="salvaModificheBlocco" icon="ui-icon ui-icon-disk" /> 
       </ace:menuBar> 
       <ace:dataTable id="blocchiTable" value="#{blocchi}" 
        binding="#{flowScope.blocchiBean.table}" stateMap="#{flowScope.blocchiBean.stateMap}" 
        selectionMode="multiple" doubleClickSelect="false" 
        rowSelectListener="#{flowScope.blocchiBean.selectListener}" 
        rowUnselectListener="#{flowScope.blocchiBean.deselectListener}" var="blocco" 
        lazy="true" rows="10" paginator="true" paginatorPosition="bottom"> 
        <ace:column id="idBloccoColumn" headerText="ID" styleClass="id"> 
         <h:outputText id="idBloccoText" value="#{blocco.id}" /> 
        </ace:column> 
        <ace:column id="numeroFileBloccoColumn" headerText="Numero file" 
         styleClass="numFile"> 
         <ace:cellEditor> 
          <f:facet name="output"> 
           <h:outputText id="numeroFileBloccoText" 
            value="#{blocco.numeroFile}" /> 
          </f:facet> 
          <f:facet name="input"> 
           <h:inputText id="numeroFileBloccoInput" 
            value="#{blocco.numeroFile}" /> 
          </f:facet> 
         </ace:cellEditor> 

        </ace:column> 
        <ace:column id="numeroColonneBloccoColumn" 
         headerText="Numero colonne" styleClass="numColonne"> 
         <ace:cellEditor> 
          <f:facet name="output"> 
           <h:outputText id="numeroColonneBloccoText" 
            value="#{blocco.numeroColonne}" /> 
          </f:facet> 
          <f:facet name="input"> 
           <h:inputText id="numeroColonneBloccoInput" 
            value="#{blocco.numeroColonne}" /> 
          </f:facet> 
         </ace:cellEditor> 

        </ace:column> 
        <ace:column id="posizioneXBloccoColumn" headerText="Posizione X" 
         styleClass="posX"> 
         <ace:cellEditor> 
          <f:facet name="output"> 
           <h:outputText id="posizioneXBloccoText" 
            value="#{blocco.posizioneX}" /> 
          </f:facet> 
          <f:facet name="input"> 
           <h:inputText id="posizioneXBloccoInput" 
            value="#{blocco.posizioneX}" /> 
          </f:facet> 
         </ace:cellEditor> 

        </ace:column> 
        <ace:column id="posizioneYBloccoColumn" headerText="Posizione Y" 
         styleClass="posY"> 
         <ace:cellEditor> 
          <f:facet name="output"> 
           <h:outputText id="posizioneYBloccoText" 
            value="#{blocco.posizioneY}" /> 
          </f:facet> 
          <f:facet name="input"> 
           <h:inputText id="posizioneYBloccoInput" 
            value="#{blocco.posizioneY}" /> 
          </f:facet> 
         </ace:cellEditor> 

        </ace:column> 
       </ace:dataTable> 
      </h:form> 
     </ace:panel> 
    </ui:define> 
</ui:composition> 

這是完整流程

<?xml version="1.0" encoding="UTF-8"?> 
<flow xmlns="http://www.springframework.org/schema/webflow" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/webflow 
     http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd"> 

    <var name="creaBloccoBean" class="com.infoone.siglo.viewbeans.CreaBloccoBean" /> 
    <var name="blocchiBean" class="com.infoone.siglo.viewbeans.BlocchiBean" /> 

    <view-state id="creablocco" view="creablocco.xhtml"> 
     <on-entry> 
      <evaluate expression="flowScope.blocchiBean.getBlocchi()" result="flowScope.blocchi" /> 
     </on-entry> 
     <transition on="creaBlocco" to="fine"> 
      <evaluate expression="gestoreBlocchiCtr.creaBlocco(creaBloccoBean)" /> 
     </transition> 
     <transition on="cancellaBlocco" to="decidiCancellazione"> 
      <evaluate expression="flowScope.blocchiBean.getRigheSelezionate()" result="flowScope.righeSelezionate"/> 
     </transition> 
     <transition on="modificaBlocco" to="decidiModifica"> 
      <evaluate expression="flowScope.blocchiBean.getRigheSelezionate()" result="flowScope.righeSelezionate"/> 
     </transition> 
    </view-state> 

    <decision-state id="decidiCancellazione"> 
     <if test="!(flowScope.righeSelezionate).isEmpty()" then="cancellaBlocco" else="fine" /> 
    </decision-state> 
    <decision-state id="decidiModifica"> 
     <if test="!(flowScope.righeSelezionate).isEmpty()" then="modificaBlocco" else="fine" /> 
    </decision-state> 

    <action-state id="cancellaBlocco"> 
     <evaluate expression="gestoreBlocchiCtr.rimuoviBlocchi(flowScope.righeSelezionate)" /> 
     <transition to="fine"/> 
    </action-state> 
    <view-state id="modificaBlocco" view="creablocco.xhtml"> 
     <on-entry> 
      <evaluate expression="flowScope.blocchiBean.abilitaModifica()"/> 
     </on-entry>  
     <transition on="salvaModificheBlocco" to="fine"> 
      <evaluate expression="flowScope.blocchiBean.salvaBlocchi()"/> 
     </transition> 
    </view-state> 

    <end-state id="fine" /> 

</flow> 

我試圖瞭解其UI組件是造成這樣的異常和,幸運的是,我能夠通過啓動調試模式服務器上的web應用程序將其隔離。 基本上,它是一個帶有22個textElement子元素的<script>節點。第三子引起該例外:

<script> 
    |------ null_icefaces_config 
    |------ ', ' 
    |------ null <<===== (This is the node which causes the exception. I mean exactly the null value associated to the "NULL type", here) 
    |------ ', ' 
    |------ unknownWindow 
    |------ [.. other children ..] 

我還考察了作家對象,該對象是包含被逐漸充滿響應的內容的輸出流中的對象的內容。通過渲染此元素生成的部分是:

<script>ice.setupBridge('null_icefaces_config 

你有沒有遇到類似的問題?你認爲我應該向ICEFaces的工作人員報告這個案例,以便他們檢查它是否是一個錯誤?

回答

2

Webflow導航模型與JSF集成的方式存在問題。 ICEFaces代碼使用階段偵聽器從請求中提取信息位,並且此階段偵聽器不會在POST-Redirect-GET Spring導航模型的GET部分中執行。有一種解決方法,即在這些情況下實現一個FlowExecutionListener來代替PhaseListener。請參閱聽衆的教程和示例實施:

http://wiki.icesoft.org/display/ICE/Spring+Web+Flow+2.3.1

+0

謝謝。謝謝! 這只是我的錯。實際上,我遵循了這個示例,但是由於注意力的集中,我從webflow:listeners列表中刪除了EXISTLY LISTENER,並用另一個代替了它,而不是簡單地添加後者。這種粗心的行爲導致我進行了兩天無用的調試。 :-S – iccuta

相關問題