JSF ViewHandlerWrapper вызывает исключение NullPointerException - PullRequest
1 голос
/ 04 августа 2010

У меня есть небольшая проблема с JSF ViewHandlerWrapper, которую я кодировал. В большинстве случаев он работает нормально, но иногда я получаю исключение NullPointerException от самого ядра Mojarra и, таким образом, начал задаваться вопросом, правильно ли я реализовал свой 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, я предположил, что он должен выглядеть как ExceptionHandlerWrapper, но так как я получаю случайный NPE, используя мой ViewHandler, я предполагаю, что что-то не так, и я не могу этого видеть.

1 Ответ

0 голосов
/ 06 августа 2010

Возможно, это связано с ошибкой частичного сохранения состояния, см. выпуск 1414 .

Ребята из IceFaces обнаружили похожую проблему и исправили ее (временно), добавив следующую строку:

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

Дай ему попробовать. Сделайте это перед рендерингом вида.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...