JSF ViewHandlerWrapper causa NullPointerException
Pergunta
Tenho um pequeno problema com um JSF ViewHandlerWrapper que codifiquei. Funciona bem na maioria das vezes, mas às vezes vou obter uma NullPointerException do centro de Mojarra e, assim, comecei a me perguntar se implementei meu viewHandlerWrapper corretamente.
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);
}
}
}
}
Do código, você percebe rapidamente que eu quero adicionar um Inputhiddidd-Componente com um valor UUID para cada Formato na vista.
Como não encontrei bons exemplos para o ViewHandlerWrappers, assumi que deveria parecer um ExceptionHandlerWrapper, mas como recebo o NPE ocasional usando meu viewhandler, presumo que algo esteja errado e não consigo vê -lo.
Solução
Isso parece estar relacionado a um bug na economia de estado parcial, veja Edição 1414.
Os caras do Icefaces encontraram um Problema semelhante E eles conseguiram (temporariamente) adicionando a seguinte linha:
facesContext.getViewRoot().addComponentResource(facesContext, new UIOutput(), "head");
De uma chance. Faça isso antes de renderizar a vista.