我是Thymeleaf的新手,正在尝试检查模板中的null属性
<form th:action="@{/saveUser/__${user.id}__}" th:object="${user}" method="post">
如果我正在编辑一个已经定义了ID的现有用户,则该表单可以很好地提交,但是使用相同的表单添加一个新用户,我得到以下信息
HTTP Status 400 - http://localhost:8080/myApp/saveUser/null"
我的控制器:
@RequestMapping(value = "/saveUser/{id}", method = RequestMethod.POST)
public String saveUser(@ModelAttribute("user") User user, @PathVariable Long id, Model model) {
model.addAttribute("user", user);
userRepo.save(user); //JPA Repo
return "success";
}
我的想法是,如果我可以检查null ID,就可以以某种方式插入唯一的ID。更好的是,如果我可以使用User对象ID上的
@GeneratedValue
设置,那么我认为我的状况会很好@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
EDIT包括我的用户编辑表单方法,该方法返回相同的表单,但预先填充了用户的模型属性
@RequestMapping(value = "/edit/user/{id}", method = RequestMethod.GET)
public ModelAndView getUserEditForm(@PathVariable Long id, Model model){
ModelAndView mav = new ModelAndView("userForm");
User user = userRepo.findOne(id);
mav.addObject("userForm", user);
return mav;
}
编辑2包括我的整个表格(用户“隐藏” ID)
<form th:action="@{/saveUser/__${user.id}__}" th:object="${user}" method="post">
<input id="id" type="hidden" th:field="*{id}" />
<input id="id" type="text" th:field="*{name}" />
<input id="id" type="text" th:field="*{address}" />
<button id="save">Save</button>
</form>
最佳答案
根据讨论,假定以下方法是您要调用的方法,该方法应填充用户对象,从而导致表单提交失败:
@RequestMapping(value = "/saveUser/{id}", method = RequestMethod.POST)
public String saveUser(@ModelAttribute("user") User user, @PathVariable Long id, Model model) {
model.addAttribute("user", user);
userRepo.save(user); //JPA Repo
return "success";
}
该方法不起作用的原因是因为您可能首先要传递一个空的用户对象。
要对此进行补救,您需要执行检查以确保在调用页面之前对象不为null。
一种解决方案可能是:
@RequestMapping(value = "/saveUser/{id}", method = RequestMethod.POST)
public String saveUser(@ModelAttribute("user") User user, @PathVariable Long id, Model model) {
userRepo.save(user); //JPA Repo
if(user == null) // check if user object is empty
user = new User(); // if user is empty, then instantiate a new user object
model.addAttribute("user", user);
return "success";
}
上面的内容将确保在将用户对象传递到模型时,它始终可用。