Spring Boot Date конвертация из формы - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть несколько проблем с получением даты от контроллера, потому что я не понимаю, какой формат подходит для него.

Контроллер:

@RequestMapping(value = "/findFlights", method = RequestMethod.POST)
    public String findFlights(@RequestParam("from") String from, @RequestParam("to") String to,
            @RequestParam("departureDate") @DateTimeFormat(pattern = "YYYY-MM-DD") LocalDate departureDate, Model model) {}

Форма:

<form th:action="@{/findFlights}" method="POST">
        From:<input type="text" name="from" required/>
        To:<input type="text" name="to" required/>
        Departure Date:<input type="date" name="departureDate"  required />
        <input type="submit" value="Search"/>
</form>

Когда я отправляю форму, она всегда выдает ошибку, независимо от формата даты :( Вот ошибка:

Не удалось преобразовать значение типа 'java.lang.String' в требуемый тип 'Java.time.LocalDate'; вложенное исключение org.springframework.core.convert.ConversionFailedException: не удалось преобразовать из типа [java.lang.String] в тип [@ Org.springframework.web.bind.annotation.RequestParam @ org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] для значения '2018-11-05'; вложенное исключение java.lang.IllegalArgumentException: попытка разбора не удалась для значения [2018-11-05]

Если я укажу аннотацию @DateTimeFormat, я подумал, что преобразование будет выполнено автоматически.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Мой совет: никогда не позволяйте клиенту отправлять отформатированные даты. Просто подумайте о часовых поясах, вы уверены, что все ваши интерфейсы находятся в одинаковых часовых поясах? Или зачем вообще нужно форматировать дату? Это должно заботиться о отображении.

Мое предложение заключается в том, что бэкэнд принимает только Longs. Преобразование выполняется клиентом и отправляется как долго. Таким образом, это совсем не двусмысленно, и вы можете относиться к длинному как угодно.

0 голосов
/ 07 ноября 2018

В YYYY-MM-DD шаблон Y - это год недели, а D - день в году согласно SimpleDateFormat javadoc . Для стандартных дат шаблон должен быть yyyy-MM-dd:

@DateTimeFormat(pattern = "yyyy-MM-dd")

или если вы хотите использовать DateTimeFormat.ISO enum:

@DateTimeFormat(iso = DateTimeFormat.ISO.DATE) 
...