P:messages ou p:growl inicializando com msg de erro

Bom dia galera, seguinte
Estou em uma página de login e, caso o login nao seja efetuado com sucesso, gostaria que exibisse uma msg informando q o login nao foi realizado.
porém ao carregar a página, tanto faz eu usar o componente growl ou messages do prime, ele carrega a pagina já com o growl descrevendo o seguinte erro:
The button/link/text component needs to have a Form in its ancestry. Please add <h:form>.

Mas conforme postarei aqui o codigo abaixo, nao visualizei lugar algum que esta faltando o form… espero que me ajudem, segue o codigo abaixo

Pagina login

<h:body>

        <ui:composition template="/template/template.xhtml">
            <ui:define name="conteudo">
                <h:form id="cadastro"> 
                    <p:growl id="aviso" showSummary="false" sticky="true" showDetail="true" life="6000" />
                    <p:panel id="painelLogin" header="#{msgs.LOGIN_PAINEL_TITULO}">

                        <h:panelGrid columns="3">
                            <h:outputLabel value="#{msgs.LOGIN_USUARIO}" />
                            <p:inputText value="#{loginMB.usuario.nome}" id="txtUsuario" label="Usuário" required="true" 
                                         requiredMessage="#{msgs.LOGIN_USUARIO_VAZIO}" /> 
                            <p:message for="txtUsuario" />
                            <h:outputLabel value="#{msgs.LOGIN_SENHA}" />
                            <p:password value="#{loginMB.usuario.senha}" id="txtSenha" label="Senha" required="true" 
                                        requiredMessage="#{msgs.LOGIN_SENHA_VAZIO}" /> 
                            <p:message for="txtSenha" />

                        </h:panelGrid>

                        <p:commandButton value="#{msgs.LOGIN_BOTAO_ENTRAR}" action="#{loginMB.logar}" update="aviso" ajax="false"/>
                        <p:commandButton value="#{msgs.LOGIN_BOTAO_RECUPERAR}" />


                    </p:panel>
                </h:form>
            </ui:define>
        </ui:composition>
    </h:body>

Template

[code]
<h:body>

    <h:form>
        <div id="layout">
            <p:layout fullPage="true" id="layout">

                <!-- Cabeçalho-->
                <p:layoutUnit position="north" resizable="false" size="100">

                </p:layoutUnit>

                <!--Menu Esquerdo -->
                <p:layoutUnit position="west">
                    <p:menu>

                        <p:submenu label="#{msgs.MENU_CADASTRO_USUARIO_TITULO}" rendered="#{loginMB.menuCadastro}">
                            <p:menuitem value="#{msgs.MENU_CADASTRO_USUARIO_LOGIN}" outcome="/index" />
                            <p:menuitem value="#{msgs.MENU_CADASTRO_USUARIO_CADASTRAR}" outcome="/usuario/cadastrar"/>
                        </p:submenu>

                        <p:submenu label="#{msgs.MENU_CADASTRO_USUARIO_TITULO}" rendered="#{loginMB.mostrarMenu}">
                            <p:menuitem value="#{msgs.MENU_CADASTRO_USUARIO_ALTERAR}"  />                            
                            <p:menuitem value="#{msgs.MENU_CADASTRO_USUARIO_LOGOFF}"  />                            
                        </p:submenu>


                        <p:submenu label="#{msgs.MENU_PERSONAGEM_TITULO}" rendered="#{loginMB.mostrarMenu}">
                            <p:menuitem value="#{msgs.MENU_PERSONAGEM_ADD}" rendered="#{loginMB.mostrarMenu}" />
                            <p:menuitem value="#{msgs.MENU_PERSONAGEM_ALTERAR}" rendered="#{loginMB.mostrarMenu}" />
                            <p:menuitem value="#{msgs.MENU_PERSONAGEM_LISTAR}" rendered="#{loginMB.mostrarMenu}" />
                        </p:submenu>

                        <p:submenu label="#{msgs.MENU_ITEM_TITULO}" rendered="#{loginMB.mostrarMenu}" >
                            <p:menuitem value="#{msgs.MENU_ITEM_EDITAR}" rendered="#{loginMB.mostrarMenu}" />
                            <p:menuitem value="#{msgs.MENU_ITEM_CONFERIR}" rendered="#{loginMB.mostrarMenu}" />
                            <p:menuitem value="#{msgs.MENU_ITEM_COMPLETO}" rendered="#{loginMB.mostrarMenu}" />
                        </p:submenu>
                    </p:menu>
                </p:layoutUnit>

                <!-- rodapé -->
                <p:layoutUnit position="south" size="50">
                    <div align="center">
                        <h:outputText style="text-align: center;" value="#{msgs.FOOTER_MESSAGE}"/>
                    </div>

                </p:layoutUnit>

                <!--Conteúdo dinâmico -->
                <p:layoutUnit position="center">
                    <ui:insert name="conteudo">
                        <h:form></h:form>
                    </ui:insert>

                </p:layoutUnit>

            </p:layout>
        </div>
    </h:form>

</h:body>[/code]

e meu método que cria a mensagem

/**
     * Método que verifica se usuário existe no banco e realiza login
     * @param usuario - usuario que sera feito o login
     * @return true caso logado, false caso erro no login
     */
    public boolean login(Usuario usuario){
        boolean logado = false;
        Connection conexao = null;
        
        try{
            conexao = GerenciadorConexoes.pegarInstancia().abrirConexao();
            String sql = GerenciadorConexoes.pegarInstancia().pegarPropriedade("VALIDA_LOGIN");
            PreparedStatement ps = conexao.prepareStatement(sql);
            
            ps.setString(1, usuario.getNome());
            ps.setString(2, usuario.getSenha());
            
            ResultSet rs = ps.executeQuery();
            
            if (rs.next()){
                logado = true;
            }else {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                        "Usuário e/ou senha inválidos","Tente Novamente"));
            }
            
        }catch(SQLException e){
            Logger.getLogger("LoginDAO").log(Level.SEVERE, "Problemas na comunicação com o banco de dados");
            Logger.getLogger("LoginDAO").log(Level.SEVERE, "Mensagem de exceção: ",e.getMessage());
        }finally{
            GerenciadorConexoes.pegarInstancia().fecharConexao(conexao);
        }
        
        return logado;
    }

será que alguem pode dar uma luz?
abraçoes e valew

Bom, pelo que eu li [ur=http://stackoverflow.com/questions/11813235/the-button-link-text-component-needs-to-have-a-form-in-its-ancestry-please-addl]aqui[/url] isso parece ser um bug do próprio Mojarra, como diz no stackoverflow você deve atualizar a versão do mesmo.

Ou… a outra solução seria fazer com a tag form estivesse dentro da tag panel e não o contrário.

pensei nisso, e tentei dentro do painel, mas nao funcionou, hehe, vou verificar mas tenho quase ctz q estou com a ultima versao do prime :smiley: qualquer coisa vou deixar sem
hehe
valews

E se você não aninhar os forms?

Você percebeu que está colocando um dentro do outro??

verdade cara, nao tinha percebido, arrumei, mas a msg continua aparecendo
:frowning:

[quote=jilles]verdade cara, nao tinha percebido, arrumei, mas a msg continua aparecendo
:([/quote]C tem certeza que não tem nenhum componente sem form?
Faz um teste? Comece a isolar componentes, tipo, retirando alguns para você ver quem pode estar causando esse erro.
Ou então, troque o growl por um h:messages e veja se a mensagem também aparecerá.

Velho, separei um por um, não adianta, não existe componente sem form ali, estranho, o h:messages tb exibe a msm mensagem
bom como era soh uma msg de login invalido vou por um p:dialog hehe
de qualquer forma abraços e mto obrigado pelo help

Porque voce declara um h:body na sua pagina de login sendo que no seu template esse h:body ja existe ?

faça um teste e veja se é isso, retire o h:body da sua pagina de login.

Pagin login

<h:body>  <--------------- RETIRE ISSO AQUI ------------------->
  
        <ui:composition template="/template/template.xhtml">  
            <ui:define name="conteudo">  
                <h:form id="cadastro">   
                    <p:growl id="aviso" showSummary="false" sticky="true" showDetail="true" life="6000" />  
                    <p:panel id="painelLogin" header="#{msgs.LOGIN_PAINEL_TITULO}">  
  
                        <h:panelGrid columns="3">  
                            <h:outputLabel value="#{msgs.LOGIN_USUARIO}" />  
                            <p:inputText value="#{loginMB.usuario.nome}" id="txtUsuario" label="Usuário" required="true"   
                                         requiredMessage="#{msgs.LOGIN_USUARIO_VAZIO}" />   
                            <p:message for="txtUsuario" />  
                            <h:outputLabel value="#{msgs.LOGIN_SENHA}" />  
                            <p:password value="#{loginMB.usuario.senha}" id="txtSenha" label="Senha" required="true"   
                                        requiredMessage="#{msgs.LOGIN_SENHA_VAZIO}" />   
                            <p:message for="txtSenha" />  
  
                        </h:panelGrid>  
  
                        <p:commandButton value="#{msgs.LOGIN_BOTAO_ENTRAR}" action="#{loginMB.logar}" update="aviso" ajax="false"/>  
                        <p:commandButton value="#{msgs.LOGIN_BOTAO_RECUPERAR}" />  
  
  
                    </p:panel>  
                </h:form>  
            </ui:define>  
        </ui:composition>  
    </h:body>     <------------ RETIRE ISSO AQUI --------------->

removido e a mensagem continua aparecendo :frowning:

Outra coisa pra voce analisar:

<!--Conteúdo dinâmico -->  
                    <p:layoutUnit position="center">  
                        <ui:insert name="conteudo">  
                            <h:form></h:form>  
                        </ui:insert>  
  
                    </p:layoutUnit>  

Ai voce chama na sua pagina login assim certo ?

<ui:define name="conteudo">    
                <h:form id="cadastro">    
------- mais codigos abaixo --------

Se for isso voce tem 1 form vazio e outro form com o conteudo, porem 2 forms, vou te mostrar meu template, nunca precisei usar o ui:define, ate porque nao gosto de declarar form dentro disso, gosto do form como um elemento principal.

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui"
	xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets">

<f:view contentType="text/html" locale="#currentLocale"/>

<h:head>
	<title>#{messages['main.app.title']}</title>
	<link type="text/css" rel="stylesheet" href="css/styles.css" />
	<style type="text/css">
		* {
			font-size: 12px; !important;
		}
	</style>
</h:head>

<h:body style="background-color:#f1f1f1">
	<table style="width: 100%">
		<tr>
			<td height="20"><ui:include src="/menu.xhtml" /></td>
		</tr>
		<tr valign="top">
			<td height="400"><ui:insert name="body" /></td>
		</tr>
		<tr align="center">
			<td height="20" align="center" class="text-input">#{messages['main.footer.text']}</td>
		</tr>
	</table>

	<p:growl id="messages" globalOnly="true" />

	<p:ajaxStatus style="width:16px;height:16px;">
		<f:facet name="start">
		</f:facet>

		<f:facet name="complete">
			<h:outputText value="" />
		</f:facet>
	</p:ajaxStatus>
	<link type="text/css" rel="stylesheet" href="css/aristo/skin.css" />
</h:body>
</html>

Na minha pagina principal eu nao declaro o form dentro de ui:define, simplesmente eu construo a pagina normalmente.

faça um teste retire o ui:define, e declare seu form sem ele. Mais uma tentativa =D, porque nunca vi essa mensagem.

hehe vou fazer o teste, mas assim, aquele form eu esqueci ali, pq na verdade eu só coloquei em uma tentativa de retirar a msg tb… vou tentar esse método novo e ja posto aqui