Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Input Date no meu form jsp

Olá, estou tentado de deixar o meu input no jsp como (type="date") mas ele apresenta o seguinte erro:

Failed to convert property value of type java.lang.String to required type java.sql.Date for property dataLancamento; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type @org.springframework.format.annotation.DateTimeFormat java.sql.Date for value 2019-09-02; nested exception is java.lang.IllegalArgumentException: Unable to parse 2019-09-02

se eu coloco o input type como text ele funciona, mais eu quero que o usuário possa ter a facilidade de abrir o calendário e selecionar a data.

Meu model:

package br.com.casadocodigo.loja.models;

import java.sql.Date;
import java.util.Calendar;
import java.util.List;

import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.annotation.DateTimeFormat.ISO;

@Entity
public class Produto {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String titulo;
    private String descricao;
    private int paginas;
    @DateTimeFormat(iso = ISO.DATE)
    private Calendar dataLancamento;

    @ElementCollection
    private List<Precos> precos;

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public int getPaginas() {
        return paginas;
    }

    public void setPaginas(int paginas) {
        this.paginas = paginas;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public List<Precos> getPrecos() {
        return precos;
    }

    public void setPrecos(List<Precos> precos) {
        this.precos = precos;
    }

    public Calendar getDataLancamento() {
        return dataLancamento;
    }

    public void setDataLancamento(Calendar dataLancamento) {
        this.dataLancamento = dataLancamento;
    }

    @Override
    public String toString() {
        return "Produto [titulo=" + titulo + ", descricao=" + descricao + ", paginas=" + paginas + "]";
    }

}

Meu WebApp

package br.com.casadocodigo.loja.conf;

import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.format.datetime.DateFormatter;
import org.springframework.format.datetime.DateFormatterRegistrar;
import org.springframework.format.support.DefaultFormattingConversionService;
import org.springframework.format.support.FormattingConversionService;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

import br.com.casadocodigo.loja.controllers.HomeController;
import br.com.casadocodigo.loja.daos.ProdutoDAO;

@EnableWebMvc
@ComponentScan(basePackageClasses = {HomeController.class, ProdutoDAO.class})
public class AppWebConfig {

    @Bean
    public InternalResourceViewResolver InternalResourceViewResolver(){

        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/view/");
        resolver.setSuffix(".jsp");

        return resolver;
    }

    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();

        messageSource.setBasename("WEB-INF/message");
        messageSource.setDefaultEncoding("UTF-8");
        messageSource.setCacheSeconds(1);

        return messageSource;
    }

    @Bean
    public FormattingConversionService  mvcConversionService() {
        DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();
        DateFormatterRegistrar registrar = new DateFormatterRegistrar();
        registrar.setFormatter(new DateFormatter("dd/MM/yyyy"));
        registrar.registerFormatters(conversionService);

        return conversionService;
    }

}
<div>
    <label for="date">Data lançamento</label>
    <form:input type="date" path="produto.dataLancamento"/>
    <form:errors path="produto.dataLancamento"/>
</div>
1 resposta
solução!

Olá Rafael!

O erro está acontecendo pois quando você passa a data pelo HTML ela está indo no formato yyyy/MM/dd e no seu código Java ele está tentando recuperar no formato dd/MM/yyyy.

Tenta alterar essa linha:

... new DateFormatter("dd/MM/yyyy") ...

Para:

... new DateFormatter("yyyy/MM/dd") ...

E veja se funciona,

Aguardo seu retorno.