1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Tag <h:message> não funciona

Olá amigos do GUJ,

Estou iniciando uma aplicação para estudo e estou esbarrando em algumas dificuldades para utilizar o JSF.

Não estou conseguindo fazer o h:message funcionar, mas quando uso o h:messages funciona.

O que acontece é que eu gostaria de saber se tem como eu registrar uma mensagem de erro através do FacesContext para um determinado campo do formulário. Utilizando h:message.

Segue meu ManagedBean:

@ManagedBean
public class CadastroTurmaMB {

    public CadastroTurmaMB() {

    }

    @EJB
    private TurmasRepository turRep;

    private int nivel;

    private int serie = -1;

    private int anoTurma = Calendar.getInstance().get(Calendar.YEAR);

    private List<Nivel> niveis = new TurmaBean().getNiveis();

    private List<Serie> series = new TurmaBean().getSeries();

    private boolean mostraSerie;

    public int getNivel() {
        return nivel;
    }

    public void setNivel(int nivel) {
        this.nivel = nivel;
    }

    public int getSerie() {
        return serie;
    }

    public void setSerie(int serie) {
        this.serie = serie;
    }

    public int getAnoTurma() {
        return anoTurma;
    }

    public void setAnoTurma(int anoTurma) {
        this.anoTurma = anoTurma;
    }

    public String save() {
        String validate = this.validate();
        if (validate != null) {
            FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    validate, validate);
            FacesContext.getCurrentInstance().addMessage(null, fm);
            return "";

        } else {

            try {
                Turmas turma = new Turmas();
                turma.setAnoTurma(this.anoTurma);
                turma.setNivel(this.nivel);
                turma.setSerie(this.serie);

                turRep.save(turma);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return "";
        }
    }

    public List<Nivel> getNiveis() {
        return niveis;
    }

    public List<Serie> getSeries() {
        return series;
    }

    public void setSeries(List<Serie> series) {
        this.series = series;
    }

    public void setNiveis(List<Nivel> niveis) {
        this.niveis = niveis;
    }

    public boolean isMostraSerie() {
        return mostraSerie;
    }

    public void setMostraSerie(boolean mostraSerie) {
        this.mostraSerie = mostraSerie;
    }

    public void mostrarSeries() {

        this.mostraSerie = this.nivel != 0 && this.nivel != -1 ? true : false;
    }

    public boolean desabilitarSerie(Serie s) {
        if (this.nivel == 1) {
            if (s.getNumeroSerie() >= 0 && s.getNumeroSerie() < 4)
                return false;
        } else if (this.nivel == 2) {
            if (s.getNumeroSerie() >= 4 && s.getNumeroSerie() < 9)
                return false;
        } else if (this.nivel == 3) {
            if (s.getNumeroSerie() >= 9 && s.getNumeroSerie() < 13)
                return false;
        } else if (this.nivel == 4) {
            if (s.getNumeroSerie() >= 4 && s.getNumeroSerie() < 7)
                return false;
        }
        return true;

    }

    /**
     * Valida, se a nova turma a ser salva estiver correta, retorna nula, caso
     * contrário retorna a mensagem de erro
     * 
     * @param turma
     * @return mensagem de erro
     */
    private String validate() {
        String compatSerNivErro = this.validaNivelSerie();

        if (this.serie == -1) {
            return "Selecione um nível";
        } else if (("" + this.getAnoTurma()).length() > 4) {
            return "Digite um ano válido (max. 4 caracteres)";
        } else if (compatSerNivErro != null) {
            return compatSerNivErro;
        } else {
            return null;
        }
    }

    /**
     * Valida se a série é compatível com o nível
     * 
     * @return
     */
    private String validaNivelSerie() {
        if (this.getNivel() == 1) {

            if (this.getSerie() >= 0 && this.getSerie() < 4)
                return null;

        } else if (this.getNivel() == 2) {

            if (this.getSerie() >= 4 && this.getSerie() < 9)
                return null;

        } else if (this.getNivel() == 3) {

            if (this.getSerie() >= 9 && this.getSerie() < 13)
                return null;

        } else if (this.getNivel() == 4) {

            if (this.getSerie() >= 4 && this.getSerie() < 7)
                return null;

        }

        return "Serie Incompatível com Nível";
    }
}

Segue minha página:

<!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:h="http://java.sun.com/jsf/html"
    xmlns:composite="http://java.sun.com/jsf/composite"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets">
<head>
<title>Cadastro de Turmas</title>
</head>
<body>

    <h1>Cadastro de Turmas</h1>

    <h:form id="cadastrodeturmas">
        <h:messages>
        <h:outputLabel value="Ano da Turma: " for="anoturma" />
        <h:inputText value="#{cadastroTurmaMB.anoTurma}" id="anoturma"
            converterMessage="Digite um número." />
        <h:message for="anoturma" id="manoturma"/>
        <br />

        <h:outputLabel value="Nivel: " for="nivel" />
        <h:selectOneMenu value="#{cadastroTurmaMB.nivel}" id="nivel"
            onchange="#{cadastroTurmaMB.mostrarSeries()}">
            <f:selectItem noSelectionOption="0" itemLabel="Selecione o nível"
                itemValue="0" />
            <f:selectItems value="#{cadastroTurmaMB.niveis}" var="v"
                itemValue="#{v.numeroNivel}" itemLabel="#{v.nomeNivel}" />
        </h:selectOneMenu>
        <h:message for="nivel" />
        <br />

        <h:commandLink value="Mostrar séries>>>"
            action="#{cadastroTurmaMB.mostrarSeries()}" />

        <h:outputLabel value="Série: "
            rendered="#{cadastroTurmaMB.mostraSerie}" />

        <h:selectOneMenu value="#{cadastroTurmaMB.serie}"
            rendered="#{cadastroTurmaMB.mostraSerie}" id="serie">
            <f:selectItems value="#{cadastroTurmaMB.series}" var="s"
                itemValue="#{s.numeroSerie}" itemLabel="#{s.nomeSerie}"
                itemDisabled="#{cadastroTurmaMB.desabilitarSerie(s)}" />
        </h:selectOneMenu>
        <br />
        <h:message for="serie" />

        <h:message for="cadastrar" />
        <br />
        <br />
        </h:messages>
        <h:commandButton id="cadastrar" value="Cadastrar"
            action="#{cadastroTurmaMB.save()}" />
    </h:form>

</body>
</html>

Estranho que estou utilizando o parâmetro "for" pra tag h:message e mesmo assim ele não funciona.

Quando tiro a tag h:messages o Servidor aponta no Console o seguinte:

AVISO: FacesMessage(s) foram enfileirados, mas podem n�o ter sido exibidos. sourceId=null[severity=(ERROR 2), summary=(Selecione um n�vel), detail=(Selecione um n�vel)]

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags jsf java ou faça a sua própria pergunta.