首页 文章

将HTML输入日期映射到Java Object的LocalDate

提问于
浏览
1

我有一个输入字段(类型:'date') - 我可以使用Thymeleaf将其映射到我的Object中的'LocalDate'字段吗?

Object

public class Project {

    @Id
    private int id;

    private LocalDate startDate;

    private LocalDate endDate;
}

HTML input

<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?

Controller

//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";
  }
}

Exception

无法将类型'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]

3 回答

  • 0

    你有几个选择:

    1 - 尝试:

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

    2 - Use Thymeleaf Extras

  • 1

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

  • 6

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

相关问题