如何从 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-0513:37。然后 Spring 必须以某种方式将这些转换为 java.sql.Datejava.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 数据库中?的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用新的 Chrome HTML5 日期输入?

如何确定从我的 html 表单获取的输入值的数据类型,以便我可以使用它们在准备好的语句中绑定参数

带有表单和 Angular 日期的 Angular/HTML 输入本地日期时间

如何从 Firefox 3 中的 HTML 输入表单获取文件路径

如何从 html 输入表单中使用 php 查找时差

如何从 PHP 输入表单中获取城市的谷歌地图?