JSF ViewHandlerWrapper provoca NullPointerException
Pregunta
Tengo un pequeño problema con un JSF ViewHandlerWrapper que he codificado. Funciona bien la mayor parte de las veces, pero a veces me conseguirá una NullPointerException desde el núcleo mismo de Mojarra y así comenzó a preguntarse si he implementado mi ViewHandlerWrapper correctamente.
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);
}
}
}
}
A partir del código se da cuenta rápidamente que quiero añadir un inputHidden -component con un valor UUID a cada forma en la vista.
Como no he encontrado ningún ejemplo de buenas ViewHandlerWrappers que supone que debe verse como una ExceptionHandlerWrapper pero ya tengo la NPE ocasional usando mi ViewHandler, supongo que algo está mal y me parece que no puede verlo.
Solución
Esto parece estar relacionado a un error en estado de ahorro parcial, consulte edición 1414 .
Los chicos icefaces encontró un problema similar y lo consiguieron (temporalmente) fijado añadiendo la siguiente línea:
facesContext.getViewRoot().addComponentResource(facesContext, new UIOutput(), "head");
Le daría una oportunidad. Hacerlo antes de renderizar la vista.