JSF manipulando a pilha de mensagens?

Fala pessoal!

Estou tentando fazer com que o <h:messages> exiba apenas a primeira mensagem de erro em um formulário.
Por exemplo, tenho um cadastro com Nome, email e senha. Se os 3 campos estiverem vázios, a mensagem vai ser igual pra todos, então queria exibir apenas uma vez. Se o campo de email e senha estão errados ou vazios, gostaria de mostrar apenas a mensagem de erro referente ao campo de e-mail, como uma cascata.

Acredito (mas não tenho certeza) que é necessário manipular a pilha de mensagens do jsf no backingBean… será que é isso mesmo?

Existe uma maneira de manipular as mensagens do Faces, de forma limitada.

Faça o seguinte:
Crie um PhaseListener para a fase RENDER_RESPONSE.
No método beforePhase:

FacesContext fc = event.getFacesContext(); Iterator iterator = fc.getMessages();
Com isso temos um Iterator para acessar cada mensagem, e as modificações serão refletidas na hora da renderização.

Como eu disse, infelizmente essa maneira (retornando um Iterator) deixa um pouco limitado o que se pode fazer. Não dá para garantir a ordem das mensagens e nem ter certeza que a remoção será possível (acho que isso depende mais da implementação do Faces que se está usando).

O melhor é você fazer alguns testes e ver se atende às necessidades do projeto.