如何将文本输入转换为 java.time.LocalDateTime?
how to convert text input to java.time.LocalDateTime?
我正在尝试制作表格,这会将新的讲座添加到我的大学数据库中。
所以,模型 class Lecture 有字段 LocalDateTime 日期,我需要将输入文本从表单转换为 LocalDateTime,我遇到问题:
Failed to convert property value of type java.lang.String to required type java.time.LocalDateTime for property date; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.time.LocalDateTime]
我的控制器:
@GetMapping("/createNew")
public String showSignUpForm(Model model) {
Lecture lecture = new Lecture();
model.addAttribute("lecture", lecture);
return "lecture/SaveLecture";
}
@PostMapping("/addLecture")
public String createLecture(@Valid Lecture lecture, BindingResult result, Model model) {
if (result.hasErrors()) {
return "lecture/SaveLecture";
}
try {
lectureService.save(lecture);
} catch (TimeTableOverlayException e) {
return "lecture/SaveLecture";
}
return this.getAllLectures(model);
}
并形成:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
<title>Save new lecture</title>
</head>
<body>
<div>
<form action="#" th:action="@{/lecture/addLecture}" th:object="${lecture}" method="POST">
...
<label for="date">Date</label>
<input type="text" th:field="*{date}" id="date" placeholder="Date&Time">
<span th:if="${#fields.hasErrors('date')}" th:errors="*{date}"></span>
<br/>
...
<input type="submit" value="Add lecture">
</form>
</div>
</body>
</html>
我的讲座class:
public class Lecture {
private int id;
private List<Group> groups = new ArrayList<>();
private Teacher teacher;
private Subject subject;
private LocalDateTime date;
private Audience audience;
public Lecture(int id) {
this.id = id;
}
public Lecture() {
}
public Lecture(Teacher teacher, Subject subject, LocalDateTime date) {
this.teacher = teacher;
this.subject = subject;
this.date = date;
}
public Lecture(int id, Teacher teacher, Subject subject, List<Group> groups, LocalDateTime dateTime) {
this.id = id;
this.teacher = teacher;
this.subject = subject;
this.groups = groups;
this.date = dateTime;
}
public Lecture(int id, Teacher teacher, Subject subject, LocalDateTime dateTime) {
this.id = id;
this.teacher = teacher;
this.subject = subject;
this.date = dateTime;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public void setGroups(List<Group> groups) {
this.groups = groups;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
public void setSubject(Subject subject) {
this.subject = subject;
}
public void setDate(LocalDateTime dt) {
this.date = dt;
}
public void setAudience(Audience audience) {
this.audience = audience;
}
public List<Group> getGroups() {
return groups;
}
public Teacher getTeacher() {
return teacher;
}
public Subject getSubject() {
return subject;
}
public LocalDateTime getDate() {
return date;
}
public Audience getAudience() {
return audience;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((audience == null) ? 0 : audience.hashCode());
result = prime * result + ((date == null) ? 0 : date.hashCode());
result = prime * result + ((groups == null) ? 0 : groups.hashCode());
result = prime * result + id;
result = prime * result + ((subject == null) ? 0 : subject.hashCode());
result = prime * result + ((teacher == null) ? 0 : teacher.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Lecture other = (Lecture) obj;
if (audience == null) {
if (other.audience != null)
return false;
} else if (!audience.equals(other.audience))
return false;
if (date == null) {
if (other.date != null)
return false;
} else if (!date.equals(other.date))
return false;
if (groups == null) {
if (other.groups != null)
return false;
} else if (!groups.equals(other.groups))
return false;
if (id != other.id)
return false;
if (subject == null) {
if (other.subject != null)
return false;
} else if (!subject.equals(other.subject))
return false;
if (teacher == null) {
if (other.teacher != null)
return false;
} else if (!teacher.equals(other.teacher))
return false;
return true;
}
}
如何将其转换为 LocalDateTime?我看到在带有注释@DateTimeFormat 的控制器中进行转换的示例,但我不明白如何在我的案例中使用它...
在评论中推荐:试试这个 remove placeholder="Date&Time" and set a default date as lecture.setDate(LocalDateTime.now());在 @GetMapping("/createNew")
我已经做到了,现在我明白了,它想要的格式是 "dd.mm.yyyy, hh:mm"。我以这样的格式输入日期并且有效。
删除placeholder="Date&Time"
。
并使用默认日期:
@GetMapping("/createNew")
public String showSignUpForm(Model model) {
Lecture lecture = new Lecture();
lecture.setDate(LocalDateTime.now())
model.addAttribute("lecture", lecture);
return "lecture/SaveLecture";
}
我正在尝试制作表格,这会将新的讲座添加到我的大学数据库中。 所以,模型 class Lecture 有字段 LocalDateTime 日期,我需要将输入文本从表单转换为 LocalDateTime,我遇到问题:
Failed to convert property value of type java.lang.String to required type java.time.LocalDateTime for property date; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.time.LocalDateTime]
我的控制器:
@GetMapping("/createNew")
public String showSignUpForm(Model model) {
Lecture lecture = new Lecture();
model.addAttribute("lecture", lecture);
return "lecture/SaveLecture";
}
@PostMapping("/addLecture")
public String createLecture(@Valid Lecture lecture, BindingResult result, Model model) {
if (result.hasErrors()) {
return "lecture/SaveLecture";
}
try {
lectureService.save(lecture);
} catch (TimeTableOverlayException e) {
return "lecture/SaveLecture";
}
return this.getAllLectures(model);
}
并形成:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
<title>Save new lecture</title>
</head>
<body>
<div>
<form action="#" th:action="@{/lecture/addLecture}" th:object="${lecture}" method="POST">
...
<label for="date">Date</label>
<input type="text" th:field="*{date}" id="date" placeholder="Date&Time">
<span th:if="${#fields.hasErrors('date')}" th:errors="*{date}"></span>
<br/>
...
<input type="submit" value="Add lecture">
</form>
</div>
</body>
</html>
我的讲座class:
public class Lecture {
private int id;
private List<Group> groups = new ArrayList<>();
private Teacher teacher;
private Subject subject;
private LocalDateTime date;
private Audience audience;
public Lecture(int id) {
this.id = id;
}
public Lecture() {
}
public Lecture(Teacher teacher, Subject subject, LocalDateTime date) {
this.teacher = teacher;
this.subject = subject;
this.date = date;
}
public Lecture(int id, Teacher teacher, Subject subject, List<Group> groups, LocalDateTime dateTime) {
this.id = id;
this.teacher = teacher;
this.subject = subject;
this.groups = groups;
this.date = dateTime;
}
public Lecture(int id, Teacher teacher, Subject subject, LocalDateTime dateTime) {
this.id = id;
this.teacher = teacher;
this.subject = subject;
this.date = dateTime;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public void setGroups(List<Group> groups) {
this.groups = groups;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
public void setSubject(Subject subject) {
this.subject = subject;
}
public void setDate(LocalDateTime dt) {
this.date = dt;
}
public void setAudience(Audience audience) {
this.audience = audience;
}
public List<Group> getGroups() {
return groups;
}
public Teacher getTeacher() {
return teacher;
}
public Subject getSubject() {
return subject;
}
public LocalDateTime getDate() {
return date;
}
public Audience getAudience() {
return audience;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((audience == null) ? 0 : audience.hashCode());
result = prime * result + ((date == null) ? 0 : date.hashCode());
result = prime * result + ((groups == null) ? 0 : groups.hashCode());
result = prime * result + id;
result = prime * result + ((subject == null) ? 0 : subject.hashCode());
result = prime * result + ((teacher == null) ? 0 : teacher.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Lecture other = (Lecture) obj;
if (audience == null) {
if (other.audience != null)
return false;
} else if (!audience.equals(other.audience))
return false;
if (date == null) {
if (other.date != null)
return false;
} else if (!date.equals(other.date))
return false;
if (groups == null) {
if (other.groups != null)
return false;
} else if (!groups.equals(other.groups))
return false;
if (id != other.id)
return false;
if (subject == null) {
if (other.subject != null)
return false;
} else if (!subject.equals(other.subject))
return false;
if (teacher == null) {
if (other.teacher != null)
return false;
} else if (!teacher.equals(other.teacher))
return false;
return true;
}
}
如何将其转换为 LocalDateTime?我看到在带有注释@DateTimeFormat 的控制器中进行转换的示例,但我不明白如何在我的案例中使用它...
在评论中推荐:试试这个 remove placeholder="Date&Time" and set a default date as lecture.setDate(LocalDateTime.now());在 @GetMapping("/createNew")
我已经做到了,现在我明白了,它想要的格式是 "dd.mm.yyyy, hh:mm"。我以这样的格式输入日期并且有效。
删除placeholder="Date&Time"
。
并使用默认日期:
@GetMapping("/createNew")
public String showSignUpForm(Model model) {
Lecture lecture = new Lecture();
lecture.setDate(LocalDateTime.now())
model.addAttribute("lecture", lecture);
return "lecture/SaveLecture";
}