#java #spring #spring-boot
#java #spring #spring-boot
Вопрос:
Я пытаюсь привязать дату в формате дд / ММ / гггг, я пробовал много вещей, таких как:
Инициализация связующего
@InitBinder
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, null, new CustomDateEditor(dateFormat, true));
}
Аннотация DateTimeFormat
@DateTimeFormat(pattern = "dd/MM/yyyy")
@Temporal(TemporalType.DATE)
private Date fecha;
Класс конфигурации
@Configuration
public class DateTimeConfig {
@Bean
public FormattingConversionService conversionService() {
DefaultFormattingConversionService conversionService =
new DefaultFormattingConversionService(false);
DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
registrar.setDateFormatter(DateTimeFormatter.ofPattern("dd-MM-yyyy"));
registrar.registerFormatters(conversionService);
// other desired formatters
return conversionService;
}
}
Но ничего из вышеперечисленного не работает, я всегда получаю эту ошибку:
Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'fecha'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.format.annotation.DateTimeFormat @javax.persistence.Temporal java.util.Date] for value '2018-10-09'; nested exception is java.lang.IllegalArgumentException: Invalid format: "2018-10-09" is malformed at "18-10-09"]
На самом деле моя модель:
@DateTimeFormat(pattern = "dd/MM/yyyy")
@Temporal(TemporalType.DATE)
private Date fecha;
<input name="fecha" type="date" th:value="*{fecha}" class="form-control" />
Комментарии:
1. Входные данные предоставляют вам дату в формате ISO. Пример. 2019-03-21. Это формат, который вы должны использовать, чтобы правильно сериализовать его как дату. Позже вы можете отформатировать эту дату другим способом.
2. Можете ли вы объяснить лучше? Я знаю, что исходный формат 2019-03-21, но как я могу его отформатировать?
3. Похоже, вы смешиваете ужасные классы date-date, которые были вытеснены много лет назад, с их заменой, классами java.time . Используйте только современные классы, такие как
LocalDate
иDateTimeFormatter
. Никогда не используйтеDate
иSimpleDateFormat
.4. Я не понимаю, в чем проблема? Если вы знаете, что получаете строку date типа ‘2019-03-21’, почему бы вам не использовать шаблон «гггг-ММ-дд» тогда для вашего форматера? Или даже лучше
DateTimeFormatter.ISO_LOCAL_DATE
.5. @JulianSolarte Вы хотите изменить формат даты во входных данных? Если это так, вы не можете этого сделать, потому что это зависит от браузера.
<input type="date">
это часть спецификации HTML5, которая очень свежая. Вместо этого вам следует отказатьсяtype=date
в пользуtype=text
какого-нибудь js-плагина / компонента datepicking. Вот так: bootstrap-datepicker.readthedocs.io/en/latest
Ответ №1:
Проблема в том, что Spring принимает только дату в формате гггг-ММ-дд в теге @DateTimeFormat, и вам следует использовать новые классы времени Java LocalDate.
Сущность
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate fecha;
Thymeleaf
<input name="fecha" type="date" th:value="*{fecha}" class="form-control" />
Входные данные могут отображаться в любом формате, в моем случае я показываю дату в формате дд / ММ / гггг, а затем Spring автоматически выполняет преобразование в гггг-ММ-дд