我目前正在为一个带有javaspringboot、thymeleaf和大学项目的salespoint框架的网站开发一个用户管理系统。
在用户可以编辑其信息的页面(例如电子邮件或密码)上,我通过 @Valid
注解。如果 BindingResult
如果有错误,它应该返回到同一个页面,向用户显示错误的输入。我在下一页中使用了这个来创建一个新用户,它可以正常工作:
@PreAuthorize("hasRole('ADMIN')")
@GetMapping("/createmember")
public String createMember(@ModelAttribute("creationForm CreationForm creationForm) {
return "/createmember";
}
@PreAuthorize("hasRole('ADMIN')")
@PostMapping("/createmember")
public String createMember(@Valid @ModelAttribute("creationForm") CreationForm creationForm, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return "/createmember";
}
//function to create new member
return "redirect:/memberlist";
}
错误消息在html页面中实现如下:
<td>
<input id="username" name="username" th:field="*{username}" required type="text" placeholder="Username">
<p th:if="${#fields.hasErrors('username')}" th:errors="*{username}"class="invalidinput">username errors</p>
</td>
当我想用它来创建一个带有动态url的页面时,问题就开始了。在下面的代码中,我想将用户的密码更改为已登录的管理员。为了让系统中的一切都知道当前编辑的是哪个用户,我使用了一个动态url password/{username}
. 只要我不检查密码是否符合我的验证要求,密码的纯更改也可以正常工作。如果 newPassword
以及 confirmationPassword
是相同的,如果不是,则不会更改密码。
@PreAuthorize("hasRole('ADMIN')")
@GetMapping("password/{username}")
public String password(@PathVariable String username, PasswordForm passwordForm) {
passwordForm.setUsername(username);
model.addAttribute("passwordForm", passwordForm);
return "/password";
}
@PreAuthorize("hasRole('ADMIN')")
@PostMapping("/password")
public String password(@Valid @ModelAttribute PasswordForm passwordForm, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return "/password";
}
if (//checks if both passwords are equal) {
//function to change password
return "redirect:/memberlist";
}
return "redirect:/";
}
html等于 createMember
.
现在的问题是,只要我给表单提供无效的输入并提交表单,thymeleaf就会抛出一个错误:
Caused by: java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'passwordForm' available as a request attribute
以及由此引起的其他一些错误。
如果我把密码改成
if (bindinResult.hasErrors()) {
return "/password/" + passwordForm.getUsername();
}
thymeleaf找不到模板“/密码/用户名”。
但是,如果我将代码更改为:
if (bindinResult.hasErrors()) {
return "redirect:/password/" + passwordForm.getUsername();
}
它重新加载页面没有问题,但一切都消失了,它没有显示任何错误,所以这不是一个选项。
我希望这不是太多,我在网上搜索了一段时间的解决方案,但没有。
有人知道问题出在哪里吗?
1条答案
按热度按时间4ngedf3f1#
几个小时没看到这个问题之后,我才发现我只是忘了设置一个
@ModelAttribute
姓名。下面的固定代码工作正常。