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