我试图创造我的第一个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]
有人会给我一个提示怎么做?感谢。
答案 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";
}