Java JSF ViewHandlerWrapper导致NullPointerException

Java JSF ViewHandlerWrapper导致NullPointerException,java,jsf,jsf-2,Java,Jsf,Jsf 2,我对我编写的JSF ViewHandlerWrapper有一个小问题。它在大多数情况下运行良好,但有时我会从Mojarra的核心得到一个NullPointerException,因此开始怀疑我是否正确实现了ViewHandlerWrapper public class TokenViewHandler extends ViewHandlerWrapper { private ViewHandler parent; public TokenViewHandler(ViewHand

我对我编写的JSF ViewHandlerWrapper有一个小问题。它在大多数情况下运行良好,但有时我会从Mojarra的核心得到一个NullPointerException,因此开始怀疑我是否正确实现了ViewHandlerWrapper

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-组件,该组件具有UUID值


由于我还没有找到ViewHandlerWrappers的任何好例子,我假设它看起来应该像一个例外的HandlerWrapper,但由于我使用ViewHandler获得了偶尔的NPE,我假设有什么问题,我似乎看不到它。

这似乎与部分状态保存中的错误有关,请参阅

IceFaces的人遇到了一个问题,他们(暂时)通过添加以下行进行了修复:

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

试试看。在渲染视图之前执行此操作。

哪一行导致NPE?我的代码中没有一行。它在莫哈拉本身,这使得它有点难以确定。我在com.sun.faces.application.view.StateManagementStrategyImpl$4.invokeContextCallback(StateManagementStrategyImpl.java:289)~[glassfish.jsf_1.0.0.0_2-0.jar:2.0.2-FCS]在javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:1253)~[javax.jsf_1.0.0.0.0.0.2-FCS]如果下一个视图通过一个动作,即commandLink->Action->output,那么NPE总是会运行。但是,如果直接调用该视图,它就可以工作。奇怪的东西:)我也检查了Mojarra的源代码,似乎框架没有意识到新组件,除非早些时候添加。问题是,如果我早些时候连接到生命周期中,其他组件还没有添加到viewRoot中,所以我基本上被卡住了。addComponentResource()调用对我没有帮助,但是,您提供的链接表明,这个问题将在Mojarra 2.0.3中解决。在更新我的库之后,它立即起作用。