【问题标题】:Map HTML input date to LocalDate of Java Object将 HTML 输入日期映射到 Java 对象的 LocalDate
【发布时间】:2018-03-06 23:10:17
【问题描述】:

我有一个输入字段(类型:“日期”)-我可以使用 Thymeleaf 将它映射到我的对象中的“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 或 endDate?

控制器

//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”的属性值转换为属性“startDate”所需的类型“java.time.LocalDate”;嵌套的 例外是 org.springframework.core.convert.ConversionFailedException: 失败 从类型 [java.lang.String] 转换为类型 [@javax.persistence.Column java.time.LocalDate] 值 '2017-09-08';嵌套异常是 java.lang.IllegalArgumentException: 值的解析尝试失败 [2017-09-08]

【问题讨论】:

    标签: java spring-boot thymeleaf localdate


    【解决方案1】:

    在 LocalDate 变量中添加@DateTimeFormat(pattern = "yyyy-MM-dd") 注释可以解决问题。

    【讨论】:

      【解决方案2】:

      你有几个选择:

      1 - 尝试:

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

      2 - Use Thymeleaf Extras

      【讨论】:

      • 太棒了!只需确保我已将答案标记为可接受的答案,以帮助其他人直接找到解决方案。
      【解决方案3】:

      您只能绑定可以用简单类型定义的模型对象。当对象从客户端序列化到服务器时,它不知道复杂类型(like java.time.LocalDate),除非它们用简单类型表示。对于您的 scnerio,最好的方法是将客户端 HTML 与服务器端 java 对象日期映射为字符串。然后,您可以将 String 对象转换为服务器端 Controller 类或任何 java 服务类中的java.time.LocalDate

      【讨论】:

        猜你喜欢
        • 2016-05-10
        • 2010-10-31
        • 2011-08-12
        • 2019-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-18
        • 2021-12-08
        相关资源
        最近更新 更多