JSF ViewHandlerWrapper вызывает исключение NullPointerException
Вопрос
У меня небольшая проблема с 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);
}
}
}
}
Из кода вы быстро поймете, что я хочу добавить входСкрытый-компонент со значением UUID для каждого форма на взгляде.
Поскольку я не нашел хороших примеров для ViewHandlerWrappers, я предположил, что он должен выглядеть как ExceptionHandlerWrapper, но, поскольку я время от времени получаю NPE с помощью своего ViewHandler, я предполагаю, что что-то не так, и не вижу этого.
Решение
Похоже, это связано с ошибкой частичного сохранения состояния, см. выпуск 1414.
Ребята из IceFaces столкнулись с аналогичная проблема и они исправили это (временно), добавив следующую строку:
facesContext.getViewRoot().addComponentResource(facesContext, new UIOutput(), "head");
Попробуйте.Сделайте это перед рендерингом представления.