如何从 html 表单中获取“日期和时间”输入并使用 Spring Boot 保存到 MySQL 数据库中?
Posted
技术标签:
【中文标题】如何从 html 表单中获取“日期和时间”输入并使用 Spring Boot 保存到 MySQL 数据库中?【英文标题】:How to get "Date and Time" input from a html form and save into MySQL db using Spring Boot? 【发布时间】:2018-06-15 08:11:00 【问题描述】:我想做什么: 用户将通过 html 表单输入日期和时间,这些值将保存到 mysql 数据库中。
createPost.html
<form action="#" th:action="@/createPost" th:object="$post" method="POST">
<p>Description: <input type="text" th:field="*text" /> </p>
<!--
<p>Time: <input type="datetime-local" th:field="*dateTime" /> </p>
-->
<p>date: <input type="date" th:field="*date" /></p>
<p>time: <input type="time" th:field="*time" /></p>
<p><input class="submitButton" type="submit" value="Submit" /> </p>
</form>
Post.java
@Entity
public class Post
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String user;
private String text;
/*
@DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm")
private LocalDateTime dateTime;
*/
private java.sql.Date date;
private LocalTime time;
@Temporal(TemporalType.TIMESTAMP)
private java.util.Date myDate;
//getters ans setters
PostController.java
@RequestMapping(value="/createPost", method=RequestMethod.POST)
public String createPost(@ModelAttribute Post post)
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String currentUser = authentication.getName();
post.setUser(currentUser);
postRepository.save(post);
return "redirect:/";
目前我收到此错误:
"bean 类 [com.example.demo.Post] 的无效属性 'date':bean 属性 'date' 不可读或有无效的 getter 方法:getter 的返回类型是否与参数匹配设置器的类型?”
我尝试了很多不同的东西,但我什么都做不了。 获取用户日期和时间输入并将其保存到数据库的推荐方法是什么?
编辑:
您只能绑定可以用简单类型定义的模型对象。当对象从客户端序列化到服务器时,它不知道复杂类型(如java.time.LocalDate),除非它们用简单类型表示。
我现在通过编写一个将字符串转换为 sql.Date 的函数解决了这个问题
public Date getDateFromString(String dateString)
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
java.util.Date parsed = null;
try
parsed = format.parse(dateString);
catch (ParseException e)
e.printStackTrace();
Date date = new Date(parsed.getTime());
return date;
并将 PostController.java 更改为:
@RequestMapping(value="/createPost", method=RequestMethod.POST)
public String createPost(@ModelAttribute Post post, String date)
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String currentUser = authentication.getName();
post.setUser(currentUser);
Utilities utilities = new Utilities();
post.setDate(utilities.getDateFromString(post.getDatestring()));
postRepository.save(post);
return "redirect:/";
丑陋但至少它有效,如果有人有更好的解决方案请告诉
【问题讨论】:
你使用的是什么版本的休眠?您收到错误的日期类型是什么?您的模型类中有三个日期/时间字段 考虑到该错误在Post
中抱怨属性date
的getter 和setter,我认为发布该类的getter 和setter 是相关的。
休眠核心 5.0.12.Final。 java.sql.Date(也适用于 getter/setter)当前错误,但我也尝试过 Timestamp 和 LocalDate 但我无法让它们中的任何一个工作
您能否发布您的 getter 和 setter 的实际代码,尤其是来自 date
字段的代码。
public java.sql.Date getDate() 返回日期; public void setDate(java.sql.Date date) this.date = date;
【参考方案1】:
嗯,屏幕后面发生的事情是您的浏览器将日期和时间都作为字符串发送,例如2018-01-05
和13:37
。然后 Spring 必须以某种方式将这些转换为 java.sql.Date
和 java.time.LocalTime
。
据我所知,通常 Spring 对 java.util.Date
有 a formatter,但对 java.sql.Date
没有。但由于某种原因,如果我对其进行测试,它似乎对java.sql.Date
工作正常。
尽管如此,java.time.LocalTime
没有现有的格式化程序,因此您必须编写自己的转换器。这可以通过实现Formatter
来完成,例如:
@Component
public class LocalTimeFormatter implements Formatter<LocalTime>
@Override
public LocalTime parse(String s, Locale locale) throws ParseException
try
return LocalTime.parse(s, DateTimeFormatter.ofPattern("HH:mm", locale));
catch (DateTimeParseException ex)
throw new ParseException(ex.getMessage(), ex.getErrorIndex());
@Override
public String print(LocalTime localTime, Locale locale)
return localTime.format(DateTimeFormatter.ofPattern("HH:mm", locale));
您得到的异常表明您的 getter/setter 类型不匹配,因此我假设您在某处有一个冲突的 getter/setter,它使用的类型与 date
字段使用的类型不同。但是您显示的代码应该可以正常工作,所以我不知道它来自哪里。
【讨论】:
以上是关于如何从 html 表单中获取“日期和时间”输入并使用 Spring Boot 保存到 MySQL 数据库中?的主要内容,如果未能解决你的问题,请参考以下文章
如何确定从我的 html 表单获取的输入值的数据类型,以便我可以使用它们在准备好的语句中绑定参数
带有表单和 Angular 日期的 Angular/HTML 输入本地日期时间