2017-07-12 4 views
0

Ich versuche, eine Aufgabenerstellungsseite zu erstellen. Es gibt ein Formular, wo der Benutzer den Namen, die Beschreibung und den Aufgabenstatus eingeben und speichern kann. Allerdings, wenn ich auf der Seite zeigt es mir diesen FehlerSpring Boot, Thymeleaf Form Fehler

There was an unexpected error (type=Internal Server Error, status=500). 
Error during execution of processor 'org.thymeleaf.spring4.processor.attr.SpringInputGeneralFieldAttrProcessor' (index) 

ich auch eine Lösch Aufgabe in meinem Programm habe und das scheint völlig in Ordnung zu arbeiten. Diese

ist, was meine mainController wie

@RequestMapping(value = "/save-task") 
    public String saveTask(@ModelAttribute("task") Task task, BindingResult bindingResult, Model model) { 
     task.setDateCreated(new Date()); 
     taskService.save(task); 
     model.addAttribute("tasks", taskService.findAll()); 
     model.addAttribute("task", new Task()); 
     model.addAttribute("mode", "MODE_TASKS"); 
     return "index"; 
    } 

@RequestMapping(value = "/delete-task") 
    public String deleteTask(@RequestParam (required = false) int id, Model model){ 
     taskService.delete(id); 
     model.addAttribute("tasks", taskService.findAll()); 
     model.addAttribute("mode", "MODE_TASKS"); 
     return "index"; 
    } 

Hier sieht die Form

<div class="container text-center"> 
     <h3>Manage Task</h3> 
     <hr/> 
     <form class="form-horizontal" method="POST" th:action="@{/save-task}" th:object="${task}"> 
      <input type="hidden" name="id" th:field="*{id}"/> 
      <div class="form-group"> 
       <label class="control-label col-md-3">Name</label> 
       <div class="col-md-7"> 
        <input type="text" class="form-control" name="name" th:field="*{name}"/> 
       </div> 
      </div> 
      <div class="form-group"> 
       <label class="control-label col-md-3">Description</label> 
       <div class="col-md-7"> 
        <input type="text" class="form-control" name="description" th:field="*{description}"/> 
       </div> 
      </div> 
      <div class="form-group"> 
       <label class="control-label col-md-3">Finished</label> 
       <div class="col-md-7"> 
        <input type="radio" class="col-sm-1" th:name="finished" value="true"/> 
        <div class="col-sm-1">Yes</div> 
        <input type="radio" class="col-sm-1" th:name="finished" value="false"/> 
        <div class="col-sm-1">No</div> 
       </div> 

       <div class="form-group"> 
        <input type="submit" class="btn btn-primary" value="Save"/> 
       </div> 
      </div> 
     </form> 
    </div> 
</div> 

löschen html Aufgabe

<tr th:each="task: ${tasks}"> 
        <td th:text="${task.id}"></td> 
        <td th:text="${task.name}"></td> 
        <td th:text="${task.description}"></td> 
        <td th:text="${task.dateCreated}"></td> 
        <td th:text="${task.finished}"></td> 
        <td><a th:href="@{'delete-task?id=' + ${task.id}}"><span class="glyphicon glyphicon-trash"></span></a> </td> 
       </tr> 

Hier ist ein Teil meiner Aufgabe Einheit ist

Hier ist der Fehler in der lockeren Spur

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'task' available as request attribute 

Antwort

0

ändern Sie Ihr Controller-Mapping GET und POST-Anforderungen zu akzeptieren. Sie erhalten den Fehler, weil Spring eine Bean nicht an das Formular binden kann. Fügen Sie also eine Bean hinzu, wenn GET aufgerufen wird.

@GetMapping("/save-task") 
public String addTask(Model model) { 
    Task task = new Task(); 
    task.setDateCreated(new Date(); 
    model.addAttribute("task", task); 
    return "save-task"; //or whatever the page is called 
} 

tun Sie dann Ihre Verarbeitung:

@PostMapping("/save-task") 
public String saveTask(@ModelAttribute("task") Task task, 
         BindingResult bindingResult, 
         Model model) { 
    taskService.save(task); 
    model.addAttribute("mode", "MODE_TASKS"); 
    return "index"; 
} 

Ihre Bohne sieht gut aus. Ich sehe nicht, dass Sie tasks in Ihrem HTML-Snippet verwenden, aber das würde in der Methode gehen, die mit @GetMapping zugeordnet ist, wenn Sie nur alle Aufgaben anzeigen möchten.

+0

Es hat nicht funktioniert. Es wirft immer noch den gleichen Fehler und speichert keine Aufgabe, wenn ich save-task einlege? Name = StudyJava & description = ForExamUpgrade in der URL – nabeelaa

+0

Wenn Sie eine log-Anweisung zur 'addTask'-Methode hinzufügen, sehen Sie es gedruckt? – bphilipnyc

0

Können Sie versuchen, BindingResult bindingResult von Ihrem saveTask Mapping zu löschen. Während Sie keine Validierung haben, brauchen Sie es nicht. Eine zweite Sache, die Sie vielleicht ändern sollten, ist Ihre Task Einheit. Ändern Sie das Feld id in einen Referenztyp Integer nicht den primitiven Typ int. Auch der Getter und Setter sollte sich dann ändern.

+0

Ich tat das oben. Immer noch der gleiche Fehler. Ich bin seit 2 Tagen auf diesem Problem fest, lol. – nabeelaa

0

Folgendes Ihre Controller-Klasse hinzufügen:

@ModelAttribute("task") 
public Task newTaskObject() { 
    return new Task(); 
} 

Es wird das Bindungsproblem lösen. Außerdem benötigen Sie einen post Controller, um die Formularübergabe zu verarbeiten.

Verwandte Themen