2017-09-25 5 views
0

J'ai un champ de saisie (type: 'date') - qui puis-je mapper à un champ 'LocalDate' dans mon objet en utilisant Thymeleaf?Mapper la date d'entrée HTML à LocalDate de l'objet Java

objet

public class Project { 

    @Id 
    private int id; 

    private LocalDate startDate; 

    private LocalDate endDate; 
} 

entrée 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>

Comment pourrais-je mapper le champ d'entrée correctement à la LocalDate startDate ou endDate?

Contrôleur

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

Impossible de convertir la valeur de la propriété de type 'java.lang.String' au type requis 'java.time.LocalDate' pour les biens 'date de début'; imbriqué exception est org.springframework.core.convert.ConversionFailedException: Impossible de converti à partir du type [java.lang.String] pour taper [@ javax.persistence.Column java.time.LocalDate] pour la valeur « 2017- 09-08 '; exception imbriquée est java.lang.IllegalArgumentException: Parse tentative a échoué pour la valeur [08/09/2017]

Répondre

2

Vous avez quelques options:

1 - Essayez:

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

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

2 - Use Thymeleaf Extras

+0

Le premier a travaillé. Je vous remercie! – ersu

+0

Super! Assurez-vous d'avoir marqué une réponse acceptable pour aider quelqu'un d'autre à aller directement à la solution. –

0

Vous ne pouvez lier des objets de modèle qui peuvent être définies avec des types simples. lorsque l'objet sérialisé du côté client au serveur, il n'a aucune connaissance sur les types complexes (like java.time.LocalDate) sauf s'ils sont exprimés interms de types simples. Pour votre scnerio, le meilleur moyen est de mapper le HTML côté client avec l'objet java côté serveur Dates 'as String. Vous pouvez ensuite convertir l'objet String en java.time.LocalDate dans la classe Contrôleur côté serveur ou toute classe de service Java.