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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top