Tengo una pregunta sobre el formato de fecha Spring + Thymeleaf. Tengo una entidad simple con campo de LocalDate date . Quiero obtener esta fecha de un usuario en forma y guardarla en la base de datos MySQL. Estoy recibiendo un error de este tipo:
No se pudo convertir el valor de propiedad del tipo java.lang.String al tipo requerido java.time.LocalDate para la fecha de la propiedad; la excepción anidada es org.springframework.core.convert.ConversionFailedException: no se pudo convertir del tipo java.lang.String al tipo java.time.LocalDate para el valor 2019-04-30; la excepción anidada es java.time.format.DateTimeParseException: el texto 2019-04-30 no se pudo analizar en el índice 2
Mi entidad:
@Entity @Table(name="game") public class Game{ @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; @Transient private User gameOwner; private LocalDate date; private LocalTime time; //other fieldsVista / formulario de Thymeleaf:
<form action="#" th:action="@{/games/addForm}" th:object="${gameForm}" method="post"> <p>Date: <input type="date" th:field="*{date}" /></p> </form>¿Cuál es la razón de este problema? ¿Quizás hay otra forma mejor de almacenar la fecha?
Problema resuelto. No sé por qué, pero cambiando mi plantilla a:
<input type="date" th:value="*{date}" th:field="*{date}" /> y agregar @DateTimeFormat(pattern = "yyyy-MM-dd") al campo de entidad resolvió el problema.
import org.springframework.format.annotation.DateTimeFormat;agregue la siguiente anotación arriba de la fecha.
@DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate date;coloque un corchete adicional alrededor de la fecha. Convertirá la fecha en cadena.
<form action="#" th:action="@{/games/addForm}" th:object="${gameForm}" method="post"> <p>Date: <input type="date" th:field="*{{date}}" /></p> </form>No puedo reproducir el error exacto, pero creo que agregar un editor personalizado para la clase LocalDate debería solucionar esto. Agregue este método a su controlador:
@InitBinder protected void initBinder(WebDataBinder binder) { binder.registerCustomEditor(LocalDate.class, new PropertyEditorSupport() { @Override public void setAsText(String text) throws IllegalArgumentException{ setValue(LocalDate.parse(text, DateTimeFormatter.ofPattern("yyyy-MM-dd"))); } @Override public String getAsText() throws IllegalArgumentException { return DateTimeFormatter.ofPattern("yyyy-MM-dd").format((LocalDate) getValue()); } }); } También es posible agregar esto globalmente, tendrá que crear una clase ControllerAdvice y agregar el método allí.