2010-08-04 116 views
1

我對編碼的JSF ViewHandlerWrapper有點問題。它在大多數情況下都能正常工作,但有時我會從Mojarra的核心中得到一個NullPointerException,因此開始懷疑我是否正確實現了ViewHandlerWrapper。JSF ViewHandlerWrapper導致NullPointerException

public class TokenViewHandler extends ViewHandlerWrapper { 
    private ViewHandler parent; 

    public TokenViewHandler(ViewHandler parent) { 
     this.parent = parent; 
    } 

    @Override 
    public ViewHandler getWrapped() { 
     return parent; 
    } 

    @Override 
    public void renderView(FacesContext context, UIViewRoot viewToRender) throws IOException, FacesException { 
     final String token = UUID.randomUUID().toString(); 

     findAndModifyForms(viewToRender, token, context); 

     getWrapped().renderView(context, viewToRender); 
    } 

    private void findAndModifyForms(final UIComponent component, final String token, final FacesContext ctx) { 
     if (component instanceof UIForm) { 
      final HtmlInputHidden hidden = (HtmlInputHidden) ctx.getApplication().createComponent(HtmlInputHidden.COMPONENT_TYPE); 
      hidden.setValue(token); 
      component.getChildren().add(hidden); 
     } else { 
      for (UIComponent tempComponent : component.getChildren()) { 
       findAndModifyForms(tempComponent, token, ctx); 
      } 
     } 
    } 
} 

從代碼,你就會發現我要添加inputHidden -component與UUID值在視圖中的每個形式

因爲我還沒有找到ViewHandlerWrappers的任何好例子,我認爲它應該看起來像一個ExceptionHandlerWrapper,但由於我使用ViewHandler得到了偶爾的NPE,我認爲有些事情是錯誤的,我似乎無法看到它。

+0

什麼生產線導致NPE? – 2010-08-04 07:43:24

+0

我的代碼中沒有任何行。這是在Mojarra本身,這使它有點難以查明。 我得到java.lang.NullPointerException:null \t at com.sun.faces.application.view.StateManagementStrategyImpl $ 4.invokeContextCallback(StateManagementStrategyImpl.java:289)〜[glassfish.jsf_1.0.0.0_2-0-2.jar :2.0.2-FCS] \t at javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:1253)〜[javax.jsf_1.0.0.0_2-0.jar:2.0.2-FCS] – SiCN 2010-08-04 08:16:28

+0

似乎是如果下一個視圖流經一個Action,即commandLink - > Action - > Outcome,NPE總是會發生。但是,如果視圖是直接調用的,它就可以工作。奇怪的東西:)我也在檢查Mojarra的來源,看來,該框架沒有意識到新的組件,除非加入更早。問題是,如果我早點掛鉤了生命週期,其他組件還沒有添加到viewRoot中,所以我基本上被卡住了。 – SiCN 2010-08-04 12:54:48

回答

0

這似乎與部分狀態保存中的錯誤有關,請參見issue 1414

ICEfaces的傢伙遇到similar problem,他們得到的(臨時)固定加入以下行:

facesContext.getViewRoot().addComponentResource(facesContext, new UIOutput(), "head"); 

試試看吧。在渲染視圖之前執行此操作。

+0

addComponentResource() - 調用並沒有幫助我,但是,您提供的鏈接表明該問題將在Mojarra 2.0.3中得到解決。更新我的庫後,它立即工作。 – SiCN 2010-08-09 13:47:44

+0

歡呼!很高興你有它的工作。 – BalusC 2010-08-09 14:03:04

相關問題