2
respostas

Usando validator-cdi com campo date em um form

Estou criando um formulário e os campos de data quando uso o type="date" o validator não aprova, porem se eu utilizar type="text" ele aprova.

Alguém sabe alguma maneira de fazer o validator aceitar o tipo date ou se tem alguma maneira do validator não verificar um determinado campo?

Segue abaixo os códigos.

Jsp:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 
<%@ taglib tagdir="/WEB-INF/tags" prefix="alura"%>
<c:import url="/WEB-INF/jsp/header.jsp"></c:import>

<form action="${linkTo[PlanoController].adiciona(null)}" method="post">
    Formulário de inserção de plano de aula.</br>

    <label for="nome">Nome:</label> 
    <input type="text" name="plano.nome" id="conteudo" class="form-control" value="${plano.nome}">
    <alura:validationMessage name="plano.nome"></alura:validationMessage>

    <label for="conteudo">Conteudo:</label> 
    <input type="text" name="plano.conteudo" id="conteudo" class="form-control" value="${plano.conteudo}">
    <alura:validationMessage name="plano.conteudo"></alura:validationMessage>

    <label for="inicio">Data de início:</label> 
    <input type="date" name="plano.inicio" id="conteudo" class="form-control" 
    value="<fmt:formatDate value="${plano.inicio}" pattern="dd/MM/yyyy"/>"/>
    <alura:validationMessage name="plano.inicio"></alura:validationMessage>

    <label for="fim">Data de finalização:</label> 
    <input type="date" name="plano.fim" id="conteudo" class="form-control" 
    value="<fmt:formatDate value="${plano.fim}" pattern="dd/MM/yyyy"/>"/>
    <alura:validationMessage name="plano.fim"></alura:validationMessage>

    <label for="etapa">Selecione uma etapa:</label>
    <select id="etapa" name="plano.etapa.id" >
    <c:forEach var="etapa" items="${etapas}">  
        <option value="${etapa.id}"> ${etapa.nome}</option>  
    </c:forEach>  
    </select>
    <input type="submit" value="Cadastrar" class="btn" />
</form>
<br>
<a href="${linkTo[PlanoController].lista()}">Voltar a lista</a>
<c:import url="/WEB-INF/jsp/footer.jsp"></c:import>

Controller:

public void form() {
        List<Etapa> etapas = etapaDao.lista();
        result.include("etapas", etapas);
    }

@IncludeParameters
    @Post
    public void adiciona(@Valid Plano plano) {
        validator.onErrorForwardTo(this).form();
        plano.setCriador(usuarioLogado.getUsuario());
        planoDao.adiciona(plano);
        result.redirectTo(this).lista();
    }
2 respostas

opa, quando você usa o input do tipo date, a data vai no formato yyyy-MM-dd, se não estou enganado. Sua validação espera a data nesse formato?

Não coloquei nenhuma configuração no validator, ele está com a configuração padrão mesmo.

No modelo da classe apenas defini como calendar e coloquei do tipo DATE.

import java.util.Calendar;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;

import org.hibernate.validator.constraints.NotEmpty;

@Entity
public class Plano {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @ManyToOne
    private Etapa etapa;

    @NotNull
    @Column(length = 3000)
    private String conteudo;

    @NotEmpty
    private String nome;

    @ManyToOne
    private Usuario criador;

    @OneToMany(mappedBy = "plano")
    private List<Aula> aula;

    @Temporal(value = TemporalType.DATE)
    private Calendar inicio;

    @Temporal(value = TemporalType.DATE)
    private Calendar fim;

(A classe tem os getters e setter não coloquei pra poupar espaço)

Já tentei retirar o pattern do input, dá o mesmo problema.

O unico lugar que coloco o pattern além do input e na list view mas não sei se interfere, vou enviar o código dela.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:import url="/WEB-INF/jsp/header.jsp"></c:import>

<a href="${linkTo[PlanoController].form()}">Criar um plano de aula</a>
<br>
<br>
<input type="button" onClick="window.print()"
value="Imprimir planos de aula"/>
<table class="table table-hover">
    <thead>
        <tr>
            <th>Id</th>
            <th>Etapa</th>
            <th>Nome</th>
            <th>Conteúdo</th>
            <th>Criador</th>
            <th>De</th>
            <th>Até</th>
            <th>Aulas relacionadas</th>
        </tr>
    </thead>
    <tbody>
        <c:forEach items="${planos}" var="p">
            <tr>
                <td>${p.id}</td>
                <td>${p.etapa.nome}</td>
                <td>${p.nome}</td>
                <td>${p.conteudo}</td>
                <td>${p.criador.nome}</td>
                <td><fmt:formatDate pattern="dd/MM/yyyy" value="${p.inicio.time}" /></td>
                <td><fmt:formatDate pattern="dd/MM/yyyy" value="${p.fim.time}" /></td>
                <td>
                <c:forEach var="a" items="${p.aula}">
                    *${a.nome}*    
                    ${formater}
                    <br>
                </c:forEach>
                </td>
                <td><form action="<c:url  value='/plano/alteraForm'/>" method="post">
                    <input type="hidden" name="plano.id" value="${p.id}"> 
                    <input type="submit" value="Alterar">
                </form>
                </td>
                <td><form action="<c:url  value='/plano/remove'/>" method="post">
                    <input type="hidden" name="_method" value="DELETE"> <input
                        type="hidden" name="plano.id" value="${p.id}"> <input
                        type="submit" value="Excluir">
                </form>
                </td>
                <td><form action="<c:url  value='/plano/planoDetalhado'/>" method="post">
                    <input type="hidden" name="plano.id" value="${p.id}"> 
                    <input type="submit" value="Detalhar">
                </form>
                </td>
            </tr>
        </c:forEach>
    </tbody>
</table>

<c:import url="/WEB-INF/jsp/footer.jsp"></c:import>

Reparei também que quando coloco do tipo date a máscara que chega nele vem dd/MM/yyyy mas não sei dizer como foi pré definido pra aceitar este formato.