Frage

Ich habe ein kleines Problem mit einem JSF ViewHandlerWrapper, dass ich codiert haben. Es funktioniert gut, die meisten der Zeit, aber manchmal werde ich eine Nullpointer aus dem Kern der Mojarra und damit begann mich zu fragen, bekommen, ob ich meinen ViewHandlerWrapper korrekt umgesetzt werden.

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);
            }
        }
    }
}

Von dem Code erkennt man schnell, dass ich ein inputHidden -Komponente mit einem UUID-Wert zu jeder Form auf der Ansicht hinzufügen möge.

Wie ich keine gute Beispiele für ViewHandlerWrappers fand ich davon aus, dass es wie ein ExceptionHandlerWrapper aussehen sollte, aber da ich die occassional NPE mit meinem Viewhandler bekommen, gehe ich davon aus, dass etwas falsch ist, und ich kann es nicht zu sehen scheinen.

War es hilfreich?

Lösung

Dies scheint einen Fehler in Teilzustand Speichern finden Sie Ausgabe 1414 .

Die IceFaces Jungs stieß auf ein ähnliches Problem und sie haben es (vorübergehend) festgesetzt indem Sie die folgende Zeile:

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

Versuchen Sie es einmal. Tun Sie es, bevor die Ansicht zu machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top