Spring Boot 2.1.5 Не удалось преобразовать значение свойства типа java.lang.String в требуемый тип java.time.LocalDate - PullRequest
0 голосов
/ 12 июня 2019

Я пытаюсь настроить приложение Spring Boot 2.1.5 / Spring MVC, используя Thymeleaf в качестве движка шаблонов. У меня есть bean-компонент, который будет поддерживать мою форму (методы получения и установки для краткости опущены):

 public class SchoolNightForm {

    private String orgName;
    private String address;
    private String location;
    private String city;
    private String state;
    private String zip;
    private String contactName;
    private String phone;

    @NotEmpty(message = "Enter a valid email.")
    private String email;

    @Positive(message = "Value must be positive.")
    private int totalStudents;

    private LocalDate dateRequested;
}

Шаблон HTML:

  <div class='form-group col-sm-9'>
                <label for='dateRequested'>Date Requested</label>
                <input type='date'  required class='form-control' id='dateRequested' name='dateRequested'
                    th:field='*{dateRequested}' />
                    <small class='text-danger' th:if="${#fields.hasErrors('dateRequested')}" th:errors='*{dateRequested}'>Valid date required</small>
            </div>

В соответствии с Документами Thymeleaf я настроил службу преобразования:

    @Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addFormatter(dateFormatter());
    }

    @Bean
    public DateFormatter dateFormatter() {
        return new DateFormatter("yyyy-MM-dd");
    }
}

Первоначально я использовал реализацию DateFormatter по умолчанию (не предоставлен формат String), но после просмотра сообщения об ошибке и просмотра формата, который форма передавала контроллеру, я изменил его соответствующим образом:

Failed to convert property value of type java.lang.String to required type java.time.LocalDate for property dateRequested; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.time.LocalDate] for value 2019-05-28; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2019-05-28]

Мои методы контроллера:

@GetMapping(value = "school-night")
public String getSchoolNight(Model model) {
    model.addAttribute("schoolNightForm", new SchoolNightForm());
    return "bk-school-night";
}

@PostMapping(value = "school-night")
public String postSchoolNigh(@Valid SchoolNightForm schoolNightForm, BindingResult result)
        throws MessagingException {
    if (result.hasErrors()) {
        return "bk-school-night";
    }
    emailService.schoolNightFotm(schoolNightForm);
    return "confirm";
}

Эта ошибка возникает при отправке запроса. Любой совет будет оценен.

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Мой вам совет: примите дату в виде строки в dto. Однако, если необходимо, используйте DateTimeFormatter, чтобы получить дату, вот так:

private final static DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");

Затем используйте его в своем методе, чтобы преобразовать его туда и обратно:

public class SchoolNightForm {

    private String orgName;
    private String address;
    private String location;
    private String city;
    private String state;
    private String zip;
    private String contactName;
    private String phone;

    @NotEmpty(message = "Enter a valid email.")
    private String email;

    @Positive(message = "Value must be positive.")
    private int totalStudents;

    private String dateRequested;
}

Тогда просто используйте объявленный форматер для разбора и форматирования

FORMATTER.format(...); // your temporal accessor like Instant or LocalDateTime
FORMATTER.parse(...); // your string like "2010-01-01"
0 голосов
/ 12 июня 2019

По ошибке я говорю, что строка не может быть преобразована в LocalDate. Возможно, вы могли бы добавить

 @JsonDeserialize(using = LocalDateDeserializer.class) // Added
 private LocalDate dateRequested;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...