Domanda

Ho un piccolo problema con un JSF ViewHandlerWrapper che ho codificato. Funziona bene la maggior parte delle volte, ma a volte mi metterò un NullPointerException dal nucleo di Mojarra e quindi ha iniziato a chiedermi se ho implementato correttamente il mio 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);
            }
        }
    }
}

Dal codice si rende conto rapidamente che voglio aggiungere un inputHidden bicomponente con un valore UUID per ogni forma per la vista.

Non ho trovato alcun esempio buoni per ViewHandlerWrappers ho pensato che dovrebbe apparire come un ExceptionHandlerWrapper ma dato che ho la NPE occasionale usando il mio ViewHandler, suppongo che qualcosa non va e io non riesco a vederlo.

È stato utile?

Soluzione

Questo sembra essere correlato a un bug nel risparmio parziale stato, vedi edizione 1414 .

I ragazzi ICEfaces riscontrato un simile problema e hanno ottenuto (temporaneamente) fisso aggiungendo la seguente riga:

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

Fare un tentativo. Farlo prima del rendering della vista.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top