2017-09-25 68 views
0

我有一個輸入字段(類型:'date') - 我可以使用Thymeleaf將其映射到我的Object中的LocalDate字段?將HTML輸入日期映射到Java對象的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或結束日期?

控制器

//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中' 所需類型 'java.time.LocalDate' 的屬性轉換'開始日期';嵌套0​​例外是 org.springframework.core.convert.ConversionFailedException:從類型無法 轉換[java.lang.String中]鍵入 [@ javax.persistence.Column java.time.LocalDate]爲值 「2017- 09-08' ;嵌套異常是java.lang.IllegalArgumentException異常: 解析嘗試失敗值[2017年9月8日]

回答

2

您有幾種選擇:

1 - 嘗試:

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

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

2 - Use Thymeleaf Extras

+0

第一個能用的。謝謝! – ersu

+0

太棒了!只要確保我已標記爲可接受的答案,以幫助其他人直接進入解決方案。 –

0

可以僅結合其可以用簡單的類型來定義模型對象。當對象從客戶端序列化到服務器時,除非它們表示簡單類型的interms,否則它不瞭解複雜類型(like java.time.LocalDate)。對於scnerio來說,最好的方法是將客戶端HTML與服務器端java對象Dates'映射爲字符串。然後,您可以將String對象轉換爲服務器端Controller類或任何Java服務類中的java.time.LocalDate