我正在使用SpringBoot与Thymeleaf构建一个简单的例子来帮助我学习这两种技术。
我的基础是THIS GUIDE
该实体是一个具有Id和内容的问候语。
我创建问候语很好,我可以列出我创建的所有问候语。
然后,我想为列表页面中的每个问候语添加删除选项。单击“删除”时,我希望删除该对象,并再次提供列表页面。
唉,当我加载列表页面时,我收到了这个错误:
java.lang.IllegalStateException:BindingResult和bean名称的明确目标对象' greeting'可用作请求属性
控制器和存储库对象
@Controller
public class GreetingController {
@Autowired
GreetingRepo gr;
@RequestMapping(value="/greeting/list", method=RequestMethod.GET)
public String greetingsForm(Model model) {
model.addAttribute("greetings", gr.findAll());
return "greeting/list";
}
@RequestMapping(value="/greeting/delete", method=RequestMethod.POST)
public String deleteGreeting(@ModelAttribute("greeting") Greeting greeting) {
gr.delete(greeting);
return "redirect:/greeting/list";
}
}
@RepositoryRestResource
interface GreetingRepo extends JpaRepository<Greeting, Long> {
}
List.html页面:
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Getting Started: Handling Form Submission</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>Result</h1>
<div th:each="greeting : ${greetings}">
<p th:text="'id: ' + ${greeting.id}" />
<p th:text="'content: ' + ${greeting.content}" />
<form action="#" th:action="@{/greeting/delete}" th:object="${greeting}" method="post">
<input type="hidden" th:field="*{id}"/>
<input type="hidden" th:field="*{content}"/>
<input type="Submit" value="Delete"/>
</form>
</div>
<a href="/greeting/add">Add another</a>
<a href="/greeting/list">Show All</a>
</body>
</html>
希望在这里推进正确的方向: - )
答案 0 :(得分:0)
我想你错过了这一行。
model.addAttribute("greeting", new Greeting());
@RequestMapping(value="/greeting/list", method=RequestMethod.GET)
public String greetingsForm(Model model) {
model.addAttribute("greeting", new Greeting());
model.addAttribute("greetings", gr.findAll());
return "greeting/list";
}
答案 1 :(得分:0)
您不必使用form
delete
问候语,您可以使用此方法轻松完成此问候。隐藏id
中greeting
的{{1}}。所以你不需要使用url
和form
。和hidden tags
annotate
方法采用以下方法接受controller
的{{1}}。
用incoming id
替换当前greeting
代码form
中的html
代码{/ 1}}。
replace
编辑: - 因为您需要在控制器中存在对象 你可以使用findOne方法从给定的id中获取对象。检查下面的例子。
delete