2017-07-12 112 views
0

我想創建一個任務創建頁面。有一種形式,用戶可以輸入名稱,說明和任務狀態並保存。然而,當我去的網頁就說明我這個錯誤春季啓動,Thymeleaf窗體錯誤

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

我也有一個刪除任務在我的計劃,這似乎完全正常工作。

這是我mainController是什麼樣子

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

這裏是形式

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

刪除任務HTML

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

這是我的任務實體的一部分

@Entity 
    @Table(name = "T_TASKS") 
    public class Task implements Serializable { 
     @Id 
     @GeneratedValue(strategy = GenerationType.AUTO) 
     @Column(name = "ID") 
     private int id; 
     @Column(name = "NAME") 
     private String name; 
     @Column(name = "DESCRIPTION") 
      private String description; 
     @Column(name = "DATE_CREATED") 
     @Temporal(TemporalType.TIMESTAMP) 
     private Date dateCreated; 
     @Column(name = "FINISHED") 
     private boolean finished; 

這裏是在農閒跟蹤

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

回答

0

更改您的控制器映射接受GET和POST請求的錯誤。你會得到這個錯誤,因爲Spring無法將bean綁定到表單。所以在調用GET時添加一個bean。

@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 
} 

然後做你的處理:

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

你豆看起來不錯。我沒有看到你在你的HTML片段中使用了tasks,但是如果你只是想顯示所有的任務,那麼這個方法將會映射到@GetMapping

+0

它沒有工作。它仍然拋出相同的錯誤,它不會保存任務,當我把保存任務?name = StudyJava&description = ForExamUpgrade在URL – nabeelaa

+0

如果你添加一個日誌語句到'addTask'方法,你看到它打印? – bphilipnyc

0

您可以嘗試從saveTask映射中刪除BindingResult bindingResult。雖然你沒有驗證,你不需要它。

你應該改變的第二件事是你的Task實體。將您的id字段更改爲參考類型Integer而不是原始類型int。此外,吸氣劑和固化劑應該改變。

+0

我做了上述。仍然拋出相同的錯誤。我一直在這個問題上停留了2天,現在哈哈。 – nabeelaa

0

以下添加到您的控制器類:

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

它將解決綁定問題。您還需要一個post控制器來處理表單提交。