Question

J'ai un petit problème avec un ViewHandlerWrapper JSF que j'ai codé. Il fonctionne très bien la plupart du temps, mais parfois je vais obtenir un NullPointerException du cœur même de Mojarra et a donc commencé à se demander si je me ViewHandlerWrapper correctement mis en œuvre.

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

À partir du code que vous rendrez vite compte que je veux ajouter un inputHidden monocomposant avec une valeur UUID à chaque forme sur la vue.

Comme je l'ai pas trouvé de bons exemples pour ViewHandlerWrappers je suppose qu'il devrait ressembler à un ExceptionHandlerWrapper mais depuis que je reçois la NPE occassional en utilisant mon ViewHandler, je suppose que quelque chose ne va pas et je ne peux pas sembler le voir.

Était-ce utile?

La solution

Cela semble être lié à un bogue dans l'économie d'état partiel, voir question 1414 .

Les gars ICEfaces rencontré un problème similaire et ils l'ont obtenu (temporairement) fixe en ajoutant la ligne suivante:

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

Lui donner un essai. Faites-le avant de rendre la vue.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top