JSF/ Primefaces problema validação required

6 respostas
cesarjunior82

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?

6 Respostas

Rodrigo_Sasaki
cesarjunior82

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

E

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

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.

G
edudebom:
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);
            }
        }
    }

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

E

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

TrataForm.limpaForm(“nomedoForm”);

Criado 13 de setembro de 2012
Ultima resposta 13 de set. de 2012
Respostas 6
Participantes 4