У меня ошибка регистрации задач, потому что время нужно конвертировать из 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]
Я потратил много дней и не могу решить эту проблему.
Заранее спасибо!
@mrkernelpanic выглядит как мм: ЧЧ AM / PM
Почему вы убрали параметр запроса из вопроса ?? Кстати, я имел в виду реальную стоимость dateAndTime .
@mrkernelpanic Я поставил это снова, потому что шаблон в запросах не такой, как тот, который я использовал в интерфейсе
Просто отправьте «11.10.2018 09:00» и ваша проблема будет решена. Вы не можете преобразовать строковое время без даты в LocalDateTime. зачем вам дата столбца, если у вас уже есть startTime и stopTome как LocalDateTime?
Если я сделаю что-то вроде String, данные наверняка будут сохранены, но я делаю что-то другое. Я регистрирую задачи в базе данных, но сравниваю endTime и time.now (). Если time (). Now больше endTime, задача будет удалена автоматически. Для этой задачи я использую cron jobs.
@FabioPlaka, вам просто нужно отправить datetime как «11.10.2018 09:00:00». Вы не можете преобразовать строковое время в LocalDateTime, потому что у него нет даты. Вам нужно добавить дату
Используйте ниже, чтобы преобразовать время из 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);
в какой класс?
Используйте его в любом классе Utility, создайте метод и используйте приведенный выше код и выставьте его, например, как общедоступный статический.
Вы можете написать конвертер для конвертации из 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;
Я попробую один раз
Это сам класс. Если установлен (autoApply = true), JPA скроет все атрибуты, если нет, вам нужно указать преобразователь для переменной, как указано выше.
Я использую этот класс и определил преобразователь для каждой переменной, которую хочу использовать, но выдает мне эту ошибку: Устраненное исключение, вызванное выполнением обработчика: org.springframework.web.bind.MissingServletRequestParameterE xception: обязательный параметр LocalDateTime 'datetime' отсутствует
Это не похоже на исходную проблему. Эта проблема, похоже, указывает на ваше отображение конечной точки Rest @RequestParam("datetime").
Я до сих пор не понял в чем проблема
У вас здесь две проблемы. Первый - это тот, о котором вы спрашивали в этом потоке (преобразование LocalDateTime в String и наоборот). Второй - тот, который вы упомянули в комментариях (org.springframework.web.bind.MissingServletRequestParameterException: Required LocalDateTime parameter 'datetime' is not present ). Второй связан с вашей конечной точкой отдыха. Похоже, что при вызове /addTask параметр входного запроса для @RequestParam("datetime") отсутствует.
Я решил вторую проблему, но первую проблему еще не решил
А как выглядит ваша строка ввода для
dateAndTime?