2010-08-04 130 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

相关问题