2
respostas

método comecaComNumeroUm não executa quando quando não há input

Olá, O título basicamente já explica meu problema. No vídeo, quando o instrutor aperta o botão "gravar" com os campos vazios, aparecem duas mensagens para ele, uma sobre o titulo, e o outra sobre o isbn. Mas para mim, só aparece a do título. Inclusive, eu debuguei o código aqui, e o método "comecaComNumeroUm" nem é chamado quando o campo isbn é vazio, só é executado quando digito algum número no campo por exemplo. Segue abaixo meu código:

meu login.xhtml

<h:body>
    <h1>Novo Livro</h1>
    <h:form>
        <h:messages id="messages" />
        <fieldset>
            <legend>Dados do Livro</legend>
            <h:panelGrid columns="2">

                <h:outputLabel value="Titulo:" for="titulo" />
                <h:inputText id="titulo" value="#{livroBean.livro.titulo}"
                    required="true" requiredMessage="O titulo é obrigatório !"
                    validatorMessage="Máximo de 40 caracteres !">
                    <f:validateLength maximum="40" />
                    <f:ajax event="blur" render="messages" />
                </h:inputText>

                <h:outputLabel value="ISBN:" for="isbn" />
                <h:inputText id="isbn" value="#{livroBean.livro.isbn}"
                    validator="#{livroBean.comecaComDigitoUm}">
                </h:inputText>

                <h:outputLabel value="Preço:" for="preco" />
                <h:inputText id="preco" value="#{livroBean.livro.preco}" />

                <h:outputLabel value="Data de Lançamento:" for="dataLancamento" />
                <h:inputText id="dataLancamento"
                    value="#{livroBean.livro.dataLancamento.time}">
                    <f:convertDateTime pattern="dd/MM/yyyy"
                        timezone="America/Sao_Paulo" />
                </h:inputText>

            </h:panelGrid>
        </fieldset>

        <fieldset>
            <legend>Dados do Autor</legend>
            <h:outputLabel value="Selecione Autores: " for="autor" />
            <h:selectOneMenu value="#{livroBean.autorId}" id="autor">
                <f:selectItems value="#{livroBean.autores}" var="autor"
                    itemLabel="#{autor.nome}" itemValue="#{autor.id}">
                </f:selectItems>
            </h:selectOneMenu>
            <h:commandButton value="Gravar Autor"
                action="#{livroBean.gravarAutor}">
                <f:ajax execute="autor" render="tabelaAutores" />
            </h:commandButton>
            <h:dataTable value="#{livroBean.autoresDoLivro}" var="autor"
                id="tabelaAutores">
                <h:column>
                    <h:outputText value="#{autor.nome}" />
                </h:column>
            </h:dataTable>

        </fieldset>
        <h:commandButton value="Gravar" action="#{livroBean.gravar}" >
        <f:ajax execute="@form" render="@form :listaDeLivros"/>
        </h:commandButton>
    </h:form>

Meu método:

package br.com.caelum.livraria.bean;

import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;

import br.com.caelum.livraria.dao.DAO;
import br.com.caelum.livraria.modelo.Autor;
import br.com.caelum.livraria.modelo.Livro;

@ManagedBean
@ViewScoped
public class LivroBean {

    ...

    public void comecaComDigitoUm(FacesContext fc, UIComponent ui, Object value) throws ValidatorException {
        String valor = value.toString();

        if(!valor.startsWith("1")) {
            throw new ValidatorException(new FacesMessage("O isbn deve começar com o digito 1 !"));
        }
    }

}

Alguém sabe o que está errado ? Grato

2 respostas

Já experimentou criar uma classe que implementa Validator e testar a validação isoladamente?

Veja o exemplo abaixo:

package br.com.xxx.validator;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

public class ValidaIsbn implements Validator {

    public void validate(FacesContext fc, UIComponent ui, Object valorTela) throws ValidatorException {

        String valor = valorTela.toString();

        if(!valor.startsWith("1")) {
            throw new ValidatorException(new FacesMessage("O isbn deve começar com o digito 1 !"));
        }

    }    

}

Olá Bispo,

Ainda não tentei essa sua sugestão, mas vou tentar já e te falo. No entanto, baixei o código da aula, e ele próprio apresenta o mesmo resultado. Estou começando a pensar se não é algo relacionado a versão de alguma coisa que estou utilizando aqui.