Преобразовать строку в LocalDateTime

У меня ошибка регистрации задач, потому что время нужно конвертировать из String в LocalDateTime, и я не знаю, как конвертировать.

Ниже мой класс Task:

@Entity
@Table(name = "task", schema = "public")
public class Task {

    @Id
    @GeneratedValue
    private Long id;

    @NotEmpty
    private String date;

    @NotEmpty
    private LocalDateTime startTime;

    @NotEmpty
    private LocalDateTime stopTime;

    @NotEmpty
    @Column(length = 1000)
    private String description;

    @ManyToOne
    @JoinColumn(name = "USER_EMAIL")
    private User user;

    public Task() {
    }

    public Task(String date, LocalDateTime startTime, LocalDateTime stopTime, String description, User user) {
        this.date = date;
        this.startTime = startTime;
        this.stopTime = stopTime;
        this.description = description;
        this.user = user;
    }

    public Task(String date, LocalDateTime startTime, LocalDateTime stopTime, String description) {
        this.date = date;
        this.startTime = startTime;
        this.stopTime = stopTime;
        this.description = description;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public LocalDateTime getStartTime() {
        return startTime;
    }

    public void setStartTime(LocalDateTime startTime) {
        this.startTime = startTime;
    }

    public LocalDateTime getStopTime() {
        return stopTime;
    }

    public void setStopTime(LocalDateTime stopTime) {
        this.stopTime = stopTime;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

В классе TaskController у меня есть эта функция для регистрации задач в базе данных:

@PostMapping("/addTask")
public String addTask(@Valid Task task,
                      BindingResult bindingResult,
                      HttpSession session,
                      @RequestParam("datetime")
                      @DateTimeFormat(pattern = "dd.MM.yyyy HH:mm:ss.SSSZ") LocalDateTime dateAndTime) {

    if (bindingResult.hasErrors()){
        return "views/taskForm";
    }

    String email = (String) session.getAttribute("email");
    taskService.addTask(task, userService.findOne(email));

    return "redirect:/users";
}

А в TaskService есть функция добавления задач в TaskController:

public void addTask(Task task, User user) {
    task.setUser(user);
    taskRepository.save(task);
}


Пожалуйста, кто-нибудь может решить эту ошибку:

Failed to convert property value of type java.lang.String to required type java.time.LocalDateTime for property startTime; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.hibernate.validator.constraints.NotEmpty java.time.LocalDateTime] for value 09:00; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [09:00]

и это:

Failed to convert property value of type java.lang.String to required type java.time.LocalDateTime for property stopTime; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.hibernate.validator.constraints.NotEmpty java.time.LocalDateTime] for value 18:00; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [18:00]

Я потратил много дней и не могу решить эту проблему.

Заранее спасибо!

А как выглядит ваша строка ввода для dateAndTime?

mrkernelpanic 10.12.2018 12:33

@mrkernelpanic выглядит как мм: ЧЧ AM / PM

Fabio Plaka 10.12.2018 12:36

Почему вы убрали параметр запроса из вопроса ?? Кстати, я имел в виду реальную стоимость dateAndTime .

mrkernelpanic 10.12.2018 12:38

@mrkernelpanic Я поставил это снова, потому что шаблон в запросах не такой, как тот, который я использовал в интерфейсе

Fabio Plaka 10.12.2018 12:40

Просто отправьте «11.10.2018 09:00» и ваша проблема будет решена. Вы не можете преобразовать строковое время без даты в LocalDateTime. зачем вам дата столбца, если у вас уже есть startTime и stopTome как LocalDateTime?

Wilder Valera 10.12.2018 15:44

Если я сделаю что-то вроде String, данные наверняка будут сохранены, но я делаю что-то другое. Я регистрирую задачи в базе данных, но сравниваю endTime и time.now (). Если time (). Now больше endTime, задача будет удалена автоматически. Для этой задачи я использую cron jobs.

Fabio Plaka 10.12.2018 15:50

@FabioPlaka, вам просто нужно отправить datetime как «11.10.2018 09:00:00». Вы не можете преобразовать строковое время в LocalDateTime, потому что у него нет даты. Вам нужно добавить дату

Wilder Valera 10.12.2018 15:52
2
7
3 705
2

Ответы 2

Используйте ниже, чтобы преобразовать время из String в LocalDateTime, но убедитесь, что вы получаете время в виде String.

String str = "2018-12-10 12:30";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime dateTime = LocalDateTime.parse(str, formatter);

в какой класс?

Fabio Plaka 10.12.2018 12:41

Используйте его в любом классе Utility, создайте метод и используйте приведенный выше код и выставьте его, например, как общедоступный статический.

theNoobProgrammer 11.12.2018 14:43

Вы можете написать конвертер для конвертации из String в LocalDateTime и наоборот.

@Converter(autoApply = true)
public class LocalDateTimeConverter implements AttributeConverter<LocalDateTime, String> {

    private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    @Override
    public String convertToDatabaseColumn(LocalDateTime locDate) {
        return (locDate == null ? null : formatter.format(locDate));
    }

    @Override
    public LocalDateTime convertToEntityAttribute(String dateValue) {
        return (dateValue == null ? null : LocalDateTime.parse(dateValue, formatter));
    }
}

Если вы хотите определить преобразователь для каждой переменной, используйте

@Convert(converter = LocalDateTimeConverter.class)
private LocalDateTime stopTime;

Я попробую один раз

Fabio Plaka 10.12.2018 12:44

Это сам класс. Если установлен (autoApply = true), JPA скроет все атрибуты, если нет, вам нужно указать преобразователь для переменной, как указано выше.

Rentius2407 10.12.2018 12:49

Я использую этот класс и определил преобразователь для каждой переменной, которую хочу использовать, но выдает мне эту ошибку: Устраненное исключение, вызванное выполнением обработчика: org.springframework.web.bind.MissingServletRequestParameterE‌ xception: обязательный параметр LocalDateTime 'datetime' отсутствует

Fabio Plaka 10.12.2018 12:51

Это не похоже на исходную проблему. Эта проблема, похоже, указывает на ваше отображение конечной точки Rest @RequestParam("datetime").

Rentius2407 10.12.2018 12:57

Я до сих пор не понял в чем проблема

Fabio Plaka 10.12.2018 14:39

У вас здесь две проблемы. Первый - это тот, о котором вы спрашивали в этом потоке (преобразование LocalDateTime в String и наоборот). Второй - тот, который вы упомянули в комментариях (org.springframework.web.bind.MissingServletRequestParameter‌​Exception: Required LocalDateTime parameter 'datetime' is not present ). Второй связан с вашей конечной точкой отдыха. Похоже, что при вызове /addTask параметр входного запроса для @RequestParam("datetime") отсутствует.

Rentius2407 10.12.2018 14:47

Я решил вторую проблему, но первую проблему еще не решил

Fabio Plaka 10.12.2018 14:54

Другие вопросы по теме