将对象的变量传递给百里香叶的控制器

时间:2017-02-26 09:45:20

标签: java spring variables thymeleaf

我试图创造我的第一个CRUD。 这是我的journeySite.html表格代码。

<table>
    <tr th:each="trip : ${trips}">
        <td th:text="${trip.title}"></td>
        <td th:text="${trip.destination}"></td>
        <td th:text="${trip.id}"></td>
            <form th:action="@{/journeys}" th:object="${trip}" method="post">
                <input type="hidden" th:field="${trip.id}" />
                <button type="submit">Delete</button>
            </form>
    </tr>
</table>

让我的控制器看起来就像那样。

@RequestMapping(value = {"/journeys"}, method = RequestMethod.GET)
public String journeysPage(Model model){
    tripRepository.save(new Trip("Asian Trip", "Asia"));
    tripRepository.save(new Trip("European Trip", "Europe"));
    tripRepository.save(new Trip("African Trip", "Africa"));

    model.addAttribute("trips", tripRepository.findAll());
    return "journeysSite";
}

@RequestMapping(value = {"/journeys"}, method = RequestMethod.POST)
public String journeysPageTripDeleting(@RequestParam Long id) {
    tripRepository.delete(id);
    return "journeysSite";
}

我想要的就是在桌子上的/旅程中展示我所有的旅行。在每一行中都有一个删除按钮,它将POST trip.id,从db中删除它并重定向到完全相同的页面,但删除了行程。

但显然发生了错误:java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'id' available as request attribute at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:144) ~[spring-webmvc-4.3.6.RELEASE.jar:4.3.6.RELEASE]

有人会给我一个提示怎么做?感谢。

3 个答案:

答案 0 :(得分:1)

在您的表单中,您定义了一个th:object="${trip}"对象,这意味着无论何时提交此表单,此trip对象都将作为请求正文发送。 因此,要接收此对象,您必须在控制器的方法中接受它。

@RequestMapping(value = {"/journeys/"}, method = RequestMethod.POST)
public String journeysPageTripDeleting(@ModelAttribute  Trip trip){
    tripRepository.delete(trip.getId());

    return "redirect:/journeys";
}

th:field="${id}"将包含在模型属性提供的对象中,因此trip对象将具有您正在寻找的ID。

更多关于this

<强>更新 使用当前控制器的方法实现,我认为您需要更改的是

<input type="hidden" th:field="*{id}" /> // No trip.id

答案 1 :(得分:0)

您需要将控制器方法的帖子代码从@RequestMapping(value = {"/journeys/"}, method = RequestMethod.POST)更改为@RequestMapping(value = {"/journeys/{id}"}, method = RequestMethod.POST)

如您所见,您忘记在RequestMapping中添加{id},这是必需的。

使用DELETE http方法删除实体而不是POST方法的标准。

答案 2 :(得分:0)

为每行创建表单不是一个好习惯。而是这样做:

<table>
    <tr th:each="trip : ${trips}">
        <td th:text="${trip.title}"></td>
        <td th:text="${trip.destination}"></td>
        <td th:text="${trip.id}"></td>
        <td><button class='delete' data-id="${trip.id}">Delete</button></td>
    </tr>
</table>

在你的html中添加这个js:

<script>
    $(document).ready(function () {
        $(document).on('click', '.delete', function () {
            $.ajax({
                url: "<c:url value="/journeys/delete"/>",
                data: {
                    id: $(this).data("id")
                },
                success: function(data) {
                    location.reload();
                }
            })
        })
    })
</script>

并改变你的控制器方法:

@RequestMapping(value = {"/journeys/delete"}, method = RequestMethod.GET)
@ResponseBody
public String journeysPageTripDeleting(@RequestParam Long id) {
    tripRepository.delete(id);
    return "success";
}