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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top