将HTML输入日期映射到Java对象的LocalDate
问题描述:
我有一个输入字段(类型:'date') - 我可以使用Thymeleaf将其映射到我的Object中的LocalDate字段?将HTML输入日期映射到Java对象的LocalDate
对象
public class Project {
@Id
private int id;
private LocalDate startDate;
private LocalDate endDate;
}
HTML输入
<form action="#"
th:action="@{|/admin/projects/add/save|}"
th:object="${newProjects}"
method="POST"
class="form-horizontal">
<input type="date" class="form-control" id="startDate"
placeholder="Project start"
th:field="*{startDate}"/>
<input type="date" class="form-control" id="endDate"
placeholder="Project start"
th:field="*{endDate}"/>
</form>
我怎么能正确映射输入字段到LOCALDATE的startDate或结束日期?
控制器
//GetMapping for Projects is also there, but I didn't paste it to keep clarity
@PostMapping("/add/save")
public String saveProject(@Valid @ModelAttribute("project") Project project,
BindingResult bindingResult,
Model model,
RedirectAttributes redirectAttributes) {
// bindingResult has error, because Thymeleaf can't map from the input-field to startDate
if (!bindingResult.hasErrors()) {
project.save(project);
return "redirect:/admin/projects/list";
} else {
return "admin/projects/add";
}
}
异常
无法类型的属性值 'java.lang.String中' 所需类型 'java.time.LocalDate' 的属性转换'开始日期';嵌套0例外是 org.springframework.core.convert.ConversionFailedException:从类型无法 转换[java.lang.String中]键入 [@ javax.persistence.Column java.time.LocalDate]为值 “2017- 09-08' ;嵌套异常是java.lang.IllegalArgumentException异常: 解析尝试失败值[2017年9月8日]
答
您有几种选择:
1 - 尝试:
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate startDate;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate endDate;
答
可以仅结合其可以用简单的类型来定义模型对象。当对象从客户端序列化到服务器时,除非它们表示简单类型的interms,否则它不了解复杂类型(like java.time.LocalDate
)。对于scnerio来说,最好的方法是将客户端HTML与服务器端java对象Dates'映射为字符串。然后,您可以将String对象转换为服务器端Controller类或任何Java服务类中的java.time.LocalDate
。
第一个能用的。谢谢! – ersu
太棒了!只要确保我已标记为可接受的答案,以帮助其他人直接进入解决方案。 –