Почему при использовании DateTimeFormat мне не удалось преобразовать ошибку свойства

#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 автоматически выполняет преобразование в гггг-ММ-дд