Failed to convert property value of type ‘java.lang.String’ to required type ‘java.util.Date’ for property ‘vigenciaDe’; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type @javax.persistence.Column @javax.persistence.Temporal java.util.Date for value ‘’; nested exception is java.lang.IllegalArgumentException
Mostre-nos a entity mapeada e mostre-nos o valor que está tentando persistir.
O valor é null, mostra o erro 0400 e no log do eclipse vi este erro, descrito no início do tópico.
Mapeamento:
@Column(name = "tit_vigencia_de")
@Temporal(TemporalType.TIMESTAMP)
public Date getVigenciaDe() {
if (this.vigenciaDe == null) {
return null;
}
return (Date) vigenciaDe.clone();
}
public void setVigenciaDe(Date vigenciaDe) {
if (vigenciaDe == null) {
this.vigenciaDe = null;
} else {
this.vigenciaDe = (Date) vigenciaDe.clone();
}
}
Se preencho a data com o valor: 16/03/2017, no debug ele mostra: 2018-04-03T00:00:00.000-0300, mas não dá erro 400.
Mas a data está chegando errado.
Acho que o problema é no mapeamento da data e ou conversão da informação.
E onde você define o valor para esta data?
Por quê do cast aqui this.vigenciaDe = (Date) vigenciaDe.clone();
? E por quê do clone()?
Sobre o clone é porque utilizamos uma vacina de código e ele dá erro na vacina.
A data vem de um jsp, código abaixo:
<div class="form-group has-info">
<label for="vigenciaDe" class="col-xs-12 col-sm-3 control-label no-padding-right">
<font style="color: red">*</font> Início da vigência:</label>
<div class="row">
<div class="col-xs-12 col-sm-5">
<div class="input-group">
<span class="input-group-addon"> <i class="fa fa-calendar bigger-110 blue"></i>
</span>
<input class="input-medium date-picker" name="vigenciaDe" id="vigenciaDe" type="text" value="${titulo.inicioVigenciaFormatado}" data-date-format="dd/mm/yyyy" placeholder="dd/mm/yyyy" />
<i class="ace-icon fa fa-info-circle"></i>
</div>
</div>
<div class="help-block col-xs-12 col-sm-reset inline"> Campo obrigatório ! <br>Só aceita dd/mm/yyyy !</div>
</div>
</div>
Resolvido
Alterei o mapeamento da data para
@Column(name = "tit_vigencia_de")
@DateTimeFormat(pattern = "dd/MM/yyyy")
@Temporal(TemporalType.TIMESTAMP)
public Date getVigenciaDe() {
if (this.vigenciaDe == null) {
return null;
}
return (Date) vigenciaDe.clone();
}
public void setVigenciaDe(Date vigenciaDe) {
if (vigenciaDe == null) {
this.vigenciaDe = null;
} else {
this.vigenciaDe = (Date) vigenciaDe.clone();
}
}
Ele vem da jsp e cai direto no método setVigenciaDe?
Sim. Primeiro ele vai na classe entity e depois na controller
Após fazer debug