Validar campos da tela

2 respostas
jsfprimefacesjava
G

Eu faço a validação dos campos no lado do servidor, no meu projeto java tem uma camada de validação atributos e regra de negocio que quando violada levanta a excessão ‘INFORMACAO_OBRIGATORIA’ ou ‘REGRA_VIOLADA’,

Tem como o JSF “entender” que houve um erro e permanecer na janela atual, apenas exibindo a mensagem do erro ? No caso a janela atual é um dialog.

Código que chama a dialog:

<p:commandButton
		icon="ui-icon-pencil"
		oncomplete="PF('dlgFabricanteManutencao').show();"
		update=":frmFabricanteManutencao:pnlFabricanteManutencao"> 
			<f:setPropertyActionListener 
				value="#{item}" 
				target="#{fabricanteBean.fabricante}" />
	</p:commandButton>

Botão da dialog que grava os dados:

<p:commandButton
		value="Gravar" 
		icon="ui-icon-disk"
		actionListener="#{fabricanteBean.salvarDados}" 
		oncomplete="PF('dlgFabricanteManutencao').hide();"
		update=":frmFabricanteTabela:tabFabricanteTabela" />

Quando ocorre a excessão no lado java é exibida a mensagem através de um grow mas a dialog é fechada,

Eu sei que existe a validação do lado cliente, mas achei que fica uma gambiara, ou estou errado ?

2 Respostas

V

Voce pode retirar o fechamento do dialog no botao:

<p:commandButton
value=“Gravar"
icon=“ui-icon-disk"
actionListener=”#{fabricanteBean.salvarDados}“
update=”:frmFabricanteTabela:tabFabricanteTabela” />

colocar um atributo para mensagem dentro do dialog no inicio/final:


<p:messages id=“messages” showDetail=“true” autoUpdate=“true” closable=“true” />
</h:form>
</p:dialog>

no lado servidor vc faz seus testes de validacao:

public void salvarDados() {
//testar a se a descrição foi preenchida
if (produto.getDescricao() == null) {
Mensagem.mostrar(“Descricao do Produto em Branco.Verifique!!”);
return;
}

//se tudo certo fecha o dialog no managed bean
RequestContext.getCurrentInstance().execute(“PF(‘dlgFabricanteManutencao’).hide()”);

o codigo do metodo mostrar na Classe Mensagem:

public static void mostrar(String pMensagem) {
System.out.println("Atencao!\n " + pMensagem);
FacesMessage fm = new FacesMessage();
fm.setSeverity(FacesMessage.SEVERITY_INFO);
fm.setSummary("Aviso: ");
fm.setDetail(pMensagem);
FacesContext.getCurrentInstance().addMessage(null, fm);
}

creio que isto seria uma forma de resolver teu problema.

Mike

Para não fechar o dialog quando ocorrer erro de validação, basta colocar um if nele que verifica se houve erro ou não

<p:commandButton ... value="Gravar"
    oncomplete="if (!args.validationFailed) PF('meuDialog').hide()" />

Essa variavel args é do proprio jsf, é conhecida como variável de callback

Você também pode fechar o dialog pelo bean, assim como o @valtemir segeriu, se você estiver usando o PrimeFaces 6.2+ o jeito correto para fechar o dialog seria:

PrimeFaces.current().executeScript("PF('meuDialog').hide()");

Pois o método execute de RequestContext esta depreciado

Segue abaixo um exemplo utilizando callback

public void meuMetodo() {

    if(objeto.getNome().length > 5) { 
        PrimeFaces.current().ajax().addCallbackParam("deuCerto", true);
    }
    else {
		PrimeFaces.current().ajax().addCallbackParam("deuCerto", false);
    }
}
<p:commandButton value="Gravar" actionListener="#{bean.meuMetodo}" oncomplete="if(args.deuCerto) PF('meuDialog').hide()"/>

Repare que o deuCerto vira um atributo de args (variavel de callback do jsf)

Criado 7 de fevereiro de 2019
Ultima resposta 7 de fev. de 2019
Respostas 2
Participantes 3