Problema com <p:message>

Estou fazendo um teste com <p:message>, porém a mensagem de erro não está aparecendo!

Segue os códigos
html

<h:form id="frmAltFcn">

			<p:panelGrid columns="3" id="pngAltFcn">
			
				<h:outputText value="Nome:"/>
				<p:inputText value="#{alterarFuncionarioBean.funcionario.nome}" id="nome"/>
				<p:message id="msgNome" for="nome"/>

                       </p:panelGrid>
	<p:commandButton actionListener="#{alterarFuncionarioBean.alterarFuncionario}" value="Alterar" update="frmAltFcn" />
</h:form>	

Segue código Java

FacesContext contex = FacesContext.getCurrentInstance();
		try 
		{
			this.logic.alterarFuncionario(this.funcionario, this.comparaFuncionario);
			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Alteração Realizada com Sucesso", "Alteração Realizada com Sucesso"));
		} 
		catch (FuncionarioException e) 
		{
			contex.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), null));
		}

Quando eu uso <p:messages> a mensagem aparece só que no topo da página. Com o <p:message> a mensagem deveria aparecer na frente de onde está o erro.

Desde já agradeço

Apague o p:message e troque por um p:messages (sem configuração alguma).

[quote=Hebert Coelho]Apague o p:message e troque por um p:messages (sem configuração alguma).[/quote]Ou melhor, nem apague. Apenas adicione o messages.

Se eu colocar <p:messages> a mensagem de erro aparece só q na parte de cima.
O que eu quero é se o nome estiver errado, a mensagem deve aparecer em frente ele!

Ao invés de vc usar o <p:messages> use o <p:message> (no singular) e coloque logo depois do código do seu componente. Tem um exemplo de utilização no demo do primefaces:

http://www.primefaces.org/showcase-labs/ui/messages.jsf

No <p:message /> tente colocar um for=“nome do componente”

tipo assim

<p:messagem for="edtNomeFun">

Edit: ops, foi mal, não vi que vc já tinha feito isso!

Cara, message é para um componente especifico. Coloque um required no input, aperte submit e veja que a mensagem vai aparecer… Ele mostra erros para aquele componente em específico. O modo que você envia a mensagem de erro, é uma mensagem global.

Sério, o que você quer fazer? Olhe o exemplo do Primefaces passado…

Eu conseguir funcionar em partes. O meu problema agora é aparecer a mensagem correta. No meu teste, a exceção é criada em uma classe própria, depois no ManagedBean eu exibo ela da seguinte forma:

this.context = FacesContext.getCurrentInstance();
		try 
		{
			this.logic.alterarFuncionario(this.funcionario, this.comparaFuncionario);
		} 
		catch (FuncionarioException e) 
		{
			this.context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), null));
		}

Se na tag do primefaces eu coloco o seguinte argumento “required”, a mensagem que aparece é a do próprio Primefaces informando “value is required”, porém não foi essa frase que eu coloquei na minha classe de exceção.
Se eu colocar requiredMessage="#{alterarFuncionarioBean.context}" a mensagem fica em branco. Pelo meu ponto de vista ele não consegue ler esse dado do context.
Outro teste que eu fiz foi criar uma String e nela atribuir o valor “getMessage()”, porém na página html o erro fica em branco.

[quote=jonatex]Eu conseguir funcionar em partes. O meu problema agora é aparecer a mensagem correta. No meu teste, a exceção é criada em uma classe própria, depois no ManagedBean eu exibo ela da seguinte forma:

this.context = FacesContext.getCurrentInstance();
		try 
		{
			this.logic.alterarFuncionario(this.funcionario, this.comparaFuncionario);
		} 
		catch (FuncionarioException e) 
		{
			this.context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), null));
		}

Se na tag do primefaces eu coloco o seguinte argumento “required”, a mensagem que aparece é a do próprio Primefaces informando “value is required”, porém não foi essa frase que eu coloquei na minha classe de exceção.
Se eu colocar requiredMessage="#{alterarFuncionarioBean.context}" a mensagem fica em branco. Pelo meu ponto de vista ele não consegue ler esse dado do context.
Outro teste que eu fiz foi criar uma String e nela atribuir o valor “getMessage()”, porém na página html o erro fica em branco.[/quote]Você viu se com o required sua classe é pelo menos chamada?

Cara, não é assim que o JSF funciona… Leia o livro Core JavaServer Faces que ensina isso tudo.

É…você não entendeu o ciclo de vida do JSF. Principalmente no que diz respeito a mensagens. O atributo required verifica, antes mesmo de ir para a classe, se há algum valor válido preenchido lá. Se não houver, ele nem vai à sua classe. Ainda na fase de validação ele volta para a sua tela e exibe a mensagem padrão do JSF. O que você pode fazer é mudar essa mensagem padrão.

Pesquise sobre isso. Explicar tudo aqui é extenso demais. Além do livro que o Hebert recomendou, ainda há alguns lugares bons na internet para você entender sobre validação e mensagens:

http://www.mkyong.com/tutorials/jsf-2-0-tutorials/
http://www.coreservlets.com/JSF-Tutorial/jsf2/