Problema com validação no JSF

Boa Tarde!!

Estou tentando fazer um login de usuário.

para os dois inputs, usuario e senha, eu estou especificando para que sejam campos obrigatórios. E para isso eu retorno o aviso logo embaixo dos inputs de cada um. Para fazer isso eu coloquei o required = true e requiredMessage=“Campo Obrigatorio!” no input de cada um.

Quando o usuário vai colocar o usuario e senha, e clica no botão entrar, e o usuario ou senha estão errados, eu coloco uma outra mensagem indicando esta falha. Logo abaixo do botão entrar mesmo.

Para esta validação de login ou senha errados, eu acessei o controller, e passei a mensagem para o FacesMessage e o FacesMessage para o FacesContext, a mensagem enviada aparece perfeitamente no h:messages.

O PROBLEMA: Quando o usuário esquece de colocar usuario ou senha, a mensagem de campo obrigatório aparece nos lugares corretos, porém, no h:messages que é da validação que eu fiz pelo controller, aparece as mensagens de campo obrigatório dos inputs também.

abaixo estão os meus códigos e também uma figura com o resultado da página que deu erro:

página de login

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html">
      <f:loadBundle basename="paginasCss" var="paginas" />
      <head>
      	<title>Testes</title>
      	
      	<link type="text/css" href="css/login.css" rel="stylesheet" />
      	<link type="text/css" href="css/padrao.css" rel="stylesheet" />
      </head>
      <body bgcolor="#B8B8B8">
      	<div class="login01">
      		<form jsfc="h:form" id="formLogin">
      		<fieldset class="fieldsetLogin"><br />
      				<label for="usuario">Usuario:</label><input jsfc="h:inputText" value="#{usuarioController.usuario.usuario}" size="30" id="usuario" required="true" requiredMessage="Campo Obrigatorio!" />
      				<span jsfc="h:message" for="usuario" class="inputSpan"></span>
      				<br /><br />
      				<label for="senha">Senha:</label><input jsfc="h:inputSecret" value="#{usuarioController.usuario.senha}" class="senha" size="30" id="senha" required="true" requiredMessage="Campo Obrigatorio!"/>
      				<span jsfc="h:message" for="senha" class="inputSpan"></span>
      				<br /><br />
      				<input jsfc="h:commandButton" type="submit" action="#{usuarioController.logar}" class="confirmar" value="Entrar" id="submit" />
      				<br />
      				<span jsfc="h:messages" for="formLogin" class="inputSpan"></span>
      			</fieldset>
      		</form>
      	</div>
      </body>
</html>

meu UsuarioController

package br.com.agenda.controller;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.persistence.NoResultException;

import br.com.agenda.dao.UsuarioDaoImp;
import br.com.agenda.entities.Usuario;

public class UsuarioController {

	private UsuarioDaoImp usuarioDaoImp;
	private Usuario usuario;
	
	public UsuarioController(){
		usuario = new Usuario();
	}
	
	public String logar(){

		String resultado = "logar";
		FacesContext context = FacesContext.getCurrentInstance();


		usuarioDaoImp = new UsuarioDaoImp();
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("usuario", usuario.getUsuario());
		params.put("senha", usuario.getSenha());
		try{
			this.setUsuario(usuarioDaoImp.pesquisarElemento("select a from Usuario a where a.usuario=:usuario and a.senha=:senha", params));
			if(this.getUsuario() == null){
				usuario = new Usuario();
				context.addMessage("formLogin", new FacesMessage("Usuario e/ou Senha incorreto!", null));
				resultado = "erro";
			}
		}catch(NoResultException he){
			he.printStackTrace();
		}

		return resultado;
		
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public UsuarioDaoImp getUsuarioDaoImp() {
		return usuarioDaoImp;
	}

	public void setUsuarioDaoImp(UsuarioDaoImp usuarioDaoImp) {
		this.usuarioDaoImp = usuarioDaoImp;
	}
	
}

Qualquer ajuda é muito bem vinda!!!


utilize o globalOnly=“true” no h:messages.

eu tentei usar o globalOnly=“true”, aí a mensagem parou de duplicar em baixo!!! perfeito!!

mas, agora ele não mostra a mensagem de erro que eu coloquei no FacesMessage!!

De qualquer forma muito obrigado, e quem souber solucionar esse outro problema eu agradeço!!!

Desculpa ai ressucitar o topico mas eu estou tendo o mesmo problema igualzinho, conseguiu resolver? Quando eu coloco o globalOnly=“true” para de duplicar mas tb para de exibir o FacesMessage =/

Alguem?

Posta o código de sua página e o trecho de codigo java onde você adiciona a msg ao FacesContext.

Aqui tem o rich:messages

[code]

[/code]

protected void addFacesMessage(Severity sev, final String msg) { FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(sev, "", msg)); }

Cara, to tentando te ajudar mas preciso entender. Pelo que to vendo, vc me mandou a página do seu template. Preciso tb da sua página real, a página do body da sua tela. Nesta, nao tem nenhum botão de ação, nada uqe faça submit na sua página. Como vc ta fazendo submit? Isso ocorre quando a página é exibida ou quando o usuário clica em alguma coisa e faz o submit? Clica onde? A msg especifica é em qual componente? Nao vi requiredMessage nem requiredTrue em nenhuma tag. Cade o action do seu managedbean que é chamado adicionando a msg ao FacesContext?

Aqui esta a tela com o required e o requiredMessage estao no selectOneMenu de Produto

[code]

<ui:composition template="/pages/templates/templatePadrao.xhtml">
<ui:define name=“corpo”>
<h:form>
<rich:panel styleClass=“panelInvisivel”>

Selecione os critérios de consulta











* Informe o período









<h:outputLabel value=“De:” /> <rich:calendar datePattern=“dd/MM/yyyy” value="#{produtosDiaBB.dataInicial}“
monthLabels=”#{produtosDiaBB.listLabelMes}">
</rich:calendar>
<h:outputLabel value=“Até:” /> <rich:calendar datePattern=“dd/MM/yyyy"
value=”#{produtosDiaBB.dataFinal}“
monthLabels=”#{produtosDiaBB.listLabelMes}"></rich:calendar>












<h:outputLabel value="*Produto:" /> <h:selectOneMenu style=“width: 290px” required=“true” requiredMessage=“teste"
value=”#{produtosDiaBB.valueComboProduto}">
<f:selectItem itemValue="" itemLabel=“Selecione…” />
<f:selectItems
value="#{produtosDiaBB.listSelectItemProduto}" />
</h:selectOneMenu>
<h:outputLabel value=“Tipo de Plano:” /> <h:selectManyListbox
value="#{produtosDiaBB.listTiposPlanosSelecionados}“
style=“width : 290px; height : 60px;”>
<f:selectItems
value=”#{produtosDiaBB.listSelectItemTipoPlano}" />
</h:selectManyListbox>











<h:outputLabel value="*Interface:" /> <h:selectOneMenu style=“width: 290px"
value=”#{produtosDiaBB.valueComboInterface}">
<f:selectItem itemValue="" itemLabel=“Selecione…” />
<f:selectItems
value="#{produtosDiaBB.listSelectItemInterface}" />
</h:selectOneMenu>
<h:outputLabel value=“Regional:” /> <h:selectManyListbox
value="#{produtosDiaBB.listRegionaisSelecionadas}“
style=“width : 290px; height : 60px;”>
<f:selectItems
value=”#{produtosDiaBB.listSelectItemRegional}" />
</h:selectManyListbox>







<h:panelGrid columns=“4”>
<h:outputLabel value=“RESULTADO DA CONSULTA DE PRODUTOS” />
<rich:spacer width=“558”></rich:spacer>
<h:commandButton value=“Exportar"
actionListener=”#{produtosDiaBB.exportaArquivoCSV}" />
<h:commandButton value=“Consultar"
actionListener=”#{produtosDiaBB.consultar}" />
</h:panelGrid>
<rich:separator lineType=“solid” height=“1” width=“100%“
align=“center” />








<rich:dataTable
id=“dadosProdutosDia” rowIndexVar=“linhaAtual"
value=”#{produtosDiaBB.listDataModelInteracaoDia}” var=“item"
rows=“10” style=” width : 950px;”>
<rich:column id=“columData”>
<f:facet name=“header”>
<h:outputLabel value=“Data” />
</f:facet>
<h:outputText value="" />
</rich:column>
							<rich:column id="columInterface">
								<f:facet name="header">
									<h:outputLabel value="Interface" />
								</f:facet>
								<h:outputText value="#{item.inter.dsInterface}" />
							</rich:column>

							<rich:column id="columProduto">
								<f:facet name="header">
									<h:outputLabel value="Produto" />
								</f:facet>
								<h:outputText value="#{item.produto.dsProduto}" />
							</rich:column>

							<rich:column id="columPlano">
								<f:facet name="header">
									<h:outputLabel value="Plano" />
								</f:facet>
								<h:outputText value="#{item.tipoPlano.dsTipoPlano}" />
							</rich:column>

							<rich:column id="columRegional">
								<f:facet name="header">
									<h:outputLabel value="Regional" />
								</f:facet>
								<h:outputText value="#{item.regional.dsRegional}" />
							</rich:column>

							<rich:column id="columInteracoes">
								<f:facet name="header">
									<h:outputLabel value="Interações" />
								</f:facet>
								<h:outputText value="" />
							</rich:column>

							<rich:column id="columTipoConteudo">
								<f:facet name="header">
									<h:outputLabel value="Tipo Conteúdo" />
								</f:facet>
								<h:outputText value="#{item.tipoConteudo.dsTipoConteudo}" />
							</rich:column>

							<rich:column id="columSucesso">
								<f:facet name="header">
									<h:outputLabel value="Sucesso" />
								</f:facet>
								<h:outputText value="" />
							</rich:column>

							<rich:column id="columAbandonos">
								<f:facet name="header">
									<h:outputLabel value="Abandonos" />
								</f:facet>
								<h:outputText value="" />
							</rich:column>

							<rich:column id="columErros">
								<f:facet name="header">
									<h:outputLabel value="Erros" />
								</f:facet>
								<h:outputText value="" />
							</rich:column>

							<f:facet name="footer">
								<rich:datascroller id="paginacaoProdutosDia" align="center"
									for="dadosProdutosDia" />
							</f:facet>
						</rich:dataTable></td>
				</tr>
			</table>
			<h:outputLabel value="#{msg.campos_obrigatorios}" />
		</rich:panel>
	</h:form>
</ui:define>

</ui:composition>

[/code]

O submit ocorre quando clico em consultar.