Search code examples
springhibernatethymeleaf

Pass id to the controller


Firstly, I am passing values from database to the table. In the first column I want to create a form that will pass the id to delete function in Controller.

<tr th:each="blg: ${all}" th:object="${blg}" >
    <td>
    <form th:action="@{/delete}" th:object= "${blg}" method="post">
    <input type="text" th:field="${blg.id}"/>
    <button type="submit">Delete</button>
    </form>
    </td>
    <td th:text="*{title}"> title </td>     
    <td th:text="*{content}"> title </td>
    <td th:text="*{category}"> title </td>
    <td th:text="*{signature}"> title </td> 
</tr>

Controller:

@GetMapping("/show")
public String show(Model model){
    List<Blog> all = br.findAll();
    model.addAttribute("all",all);
    return "show";
}

@RequestMapping(value="/delete", method=RequestMethod.POST)
    public String deletePost(@RequestParam Long id){        
        br.delete(id);        
        return "redirect:/show";
    }

The thymeleaf engine doesn't map the object as this error occcurs:

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

What is the way to create a correct form in this case?


Solution

  • Update your html code as shown below:

    <tr th:each="blg: ${all}" >
        <td>
            <form th:action="@{|/delete/${blg.id}|}" method="post">
                <button type="submit">Delete</button>
            </form>
        </td>
        <td th:text="${blg.title}"> title </td>     
        <td th:text="${blg.content}"> title </td>
        <td th:text="${blg.category}"> title </td>
        <td th:text="${blg.signature}"> title </td> 
    </tr>
    

    Better to use HTTP method DELETE for delete operations.

    The reason because th:object tried to look in your request attribute for the attribute blg. But blg is a result of an iteration.