如何将HTML Date输入值转为Java Date对象(Thymeleaf场景)
Thymeleaf表单绑定Date类型字段的解决方案
问题场景
需要通过Thymeleaf表单为Projekt对象的datum_start和datum_end(均为Date类型)赋值,但HTML的date输入控件无法直接传递Date对象到后端,导致后端接收的日期字段为null。
现有代码
Thymeleaf表单代码
<form action="#" th:action="@{neuesProjektErstellen}" th:object="${Projekt}" method="post"> Name: <input type="text" th:field="*{name}" required/><br> Beschreibung: <input type="text" th:field="*{beschreibung}" required/><br> Startdatum: <input type="date" th:field="*{datum_start}" id="datum_startProjektAdd" required/><br> Enddatum: <input type="date" th:field="*{datum_end}" id="datum_endProjektAdd" required/><br> <br> <input type="submit" value="Projekt erstellen"/> <input type="reset" value="Clear"/> </form>
注:原表单中
Enddatum的required属性拼写错误(写成了equired),需修正以确保前端验证生效。
Controller处理方法
@PostMapping("/neuesProjektErstellen") public String neuesProjektErstellen(@ModelAttribute(value = "Projekt") Projekt projekt, Model m) { if(projekt.getDatum_start()==null || projekt.getDatum_end()==null) { return "DatumFalsch"; } else { projektRepository.save(projekt); return "redirect:Projekte"; } }
Projekt实体类字段
@Column (columnDefinition = "date") private Date datum_start; @Column (columnDefinition = "date") private Date datum_end;
可行解决方向
1. 为实体类字段添加@DateTimeFormat注解
HTML的date输入控件会以yyyy-MM-dd格式提交日期字符串,只需在实体类的Date字段上添加@DateTimeFormat注解,指定对应格式,Spring就能自动完成字符串到Date的转换。
修改后的实体类字段代码:
@Column (columnDefinition = "date") @DateTimeFormat(pattern = "yyyy-MM-dd") private Date datum_start; @Column (columnDefinition = "date") @DateTimeFormat(pattern = "yyyy-MM-dd") private Date datum_end;
2. 配置全局日期格式化规则
如果项目中有多个Date类型字段需要绑定,可通过配置类设置全局日期转换规则,避免逐个字段添加注解。
创建配置类:
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addFormatters(FormatterRegistry registry) { DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); registry.addFormatterForFieldType(Date.class, new DateFormatter(dateFormatter.toPattern())); } }
3. 手动接收并转换日期(备选方案)
若上述自动转换方案不适用,可在Controller中直接接收字符串类型的日期参数,手动转换为Date对象后设置到Projekt实例中。
修改后的Controller代码:
@PostMapping("/neuesProjektErstellen") public String neuesProjektErstellen(@RequestParam("datum_start") String startDateStr, @RequestParam("datum_end") String endDateStr, @ModelAttribute(value = "Projekt") Projekt projekt, Model m) { try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date startDate = sdf.parse(startDateStr); Date endDate = sdf.parse(endDateStr); projekt.setDatum_start(startDate); projekt.setDatum_end(endDate); projektRepository.save(projekt); return "redirect:Projekte"; } catch (ParseException e) { return "DatumFalsch"; } }
内容的提问来源于stack exchange,提问作者TrYxer
相关产品推荐
相关产品推荐

