JSF/ Primefaces problema validação required

Pessoal, estaou enfrentando um problema com JSF/Primefaces, que imagino que esteja relacionado ao ciclo de vida.

O problema é o seguinte: Eu tenho um formulário cadastrado e ao editá-lo, eu apago um campo obrigatório (required = true) e tento salvar. O sistema destaca o campo e informa que o mesmo é obrigatório, o que está perfeitamente correto.

O problema é que nesta validação ele retorna ao campo o valor que eu havia apagado, ou seja, o valor que está na base de dados.
O que eu quero é que ele mantenha o campo vazio na validação, uma vez que eu o apaguei. Alguma ajuda?

Detalhe. Estou usando a versão 2.1 do JSF.

Uma maneira, mas “força bruta” seria


    public static void limpaForm(String nomeform) {
        
        FacesContext context = FacesContext.getCurrentInstance();
        UIForm form = null;
        try {
            form = (UIForm) context.getViewRoot().findComponent(nomeform);
            cleanSubmittedValues(form);
        } catch (Exception e) {
        }
    }

    private static void cleanSubmittedValues(UIComponent component) {
        
        if (component instanceof EditableValueHolder) {
            EditableValueHolder evh = (EditableValueHolder) component;
            evh.setSubmittedValue(null);
            evh.setValue(null);
            evh.setLocalValueSet(false);
            evh.setValid(true);
        }
        if (component.getChildCount() > 0) {
            for (UIComponent child : component.getChildren()) {
                cleanSubmittedValues(child);
            }
        }
    }

Uma solução é setar…

javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL false

…no web.xml. O problema é que ele só funciona para campo input text. Um pikclist, por exemplo, não funciona.
E onde tiver validação com <f:validateLength minimum=“14” />, por exemplo.

[quote=edudebom]Uma maneira, mas “força bruta” seria

[code]

public static void limpaForm(String nomeform) {
    
    FacesContext context = FacesContext.getCurrentInstance();
    UIForm form = null;
    try {
        form = (UIForm) context.getViewRoot().findComponent(nomeform);
        cleanSubmittedValues(form);
    } catch (Exception e) {
    }
}

private static void cleanSubmittedValues(UIComponent component) {
    
    if (component instanceof EditableValueHolder) {
        EditableValueHolder evh = (EditableValueHolder) component;
        evh.setSubmittedValue(null);
        evh.setValue(null);
        evh.setLocalValueSet(false);
        evh.setValid(true);
    }
    if (component.getChildCount() > 0) {
        for (UIComponent child : component.getChildren()) {
            cleanSubmittedValues(child);
        }
    }
}

[/code][/quote]

edudebom, esse seu código é para colocar dentro da classe que eu estiver utilizando ou tenho que sobrescrever alguma classe especifica do Faces???

Pode jogar numa classe separada (por exemplo “TrataForm”) e na suas classe chamar ela com algo tipo:

TrataForm.limpaForm(“nomedoForm”);