我有一个JSF ViewHandlerWrapper一个小问题,我已经编码。它工作正常,大部分的时间,但有时我会从钻嘴鱼科的核心得到一个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 -component与UUID值到每个表格上的视图。

由于我没有发现ViewHandlerWrappers我认为它应该看起来像一个ExceptionHandlerWrapper但因为我得到的偶尔使用NPE的ViewHandler我任何很好的例子,我认为什么是错的,我似乎无法看到它。

有帮助吗?

解决方案

这似乎与在部分国家储蓄的一个错误,请参阅问题1414

ICEfaces的人遇到了类似的问题和他们得到了(暂时地)固定通过添加以下行:

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

试试看。呈现视图之前做到这一点。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top