形式为

时间:2017-03-28 21:05:01

标签: java mysql spring hibernate thymeleaf

我对Spring + Thymeleaf日期格式有疑问。 我有一个带LocalDate date字段的简单实体。我希望从表单中的用户获取此日期并将其保存到MySQL数据库。 我收到这样的错误:

  

无法将类型为java.lang.String的属性值转换为属性日期所需的java.time.LocalDate类型;嵌套异常是org.springframework.core.convert.ConversionFailedException:无法从类型java.lang.String转换为类型java.time.LocalDate,值为2019-04-30;嵌套异常是java.time.format.DateTimeParseException:无法在索引2处解析文本2019-04-30

我的实体:

@Entity
@Table(name="game")
public class Game{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    @Transient
    private User gameOwner;
    private LocalDate date;
    private LocalTime time;

    //other fields

Thymeleaf观点/表格:

<form action="#" th:action="@{/games/addForm}" th:object="${gameForm}" method="post">    
    <p>Date: <input type="date" th:field="*{date}" /></p>
</form>

这个问题的原因是什么?也许存在其他更好的存储日期方式?

4 个答案:

答案 0 :(得分:7)

问题解决了.. 我不知道为什么,但将模板更改为:

<input type="date" th:value="*{date}" th:field="*{date}" />

并将@DateTimeFormat(pattern = "yyyy-MM-dd")添加到实体字段解决了问题。

答案 1 :(得分:1)

我无法重现确切的错误,但我相信为LocalDate类添加自定义编辑器应该可以解决这个问题。将此方法添加到您的控制器:

@InitBinder
protected void initBinder(WebDataBinder binder) {
  binder.registerCustomEditor(LocalDate.class, new PropertyEditorSupport() {
    @Override
    public void setAsText(String text) throws IllegalArgumentException{
      setValue(LocalDate.parse(text, DateTimeFormatter.ofPattern("yyyy-MM-dd")));
    }

    @Override
    public String getAsText() throws IllegalArgumentException {
      return DateTimeFormatter.ofPattern("yyyy-MM-dd").format((LocalDate) getValue());
    }
  });
}

也可以全局添加,您必须创建一个ControllerAdvice类并在那里添加方法。

答案 2 :(得分:1)

Thymeleaf为此提供了额外的模块:https://github.com/thymeleaf/thymeleaf-extras-java8time

添加以下依赖项(maven)就足够了:

<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-java8time</artifactId>
</dependency>

答案 3 :(得分:0)

import org.springframework.format.annotation.DateTimeFormat;

在日期之后添加以下注释。

@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate date;

在日期前后附加花括号。它将日期转换为字符串

<form action="#" th:action="@{/games/addForm}" th:object="${gameForm}" method="post">    
    <p>Date: <input type="date" th:field="*{{date}}" /></p>
</form>