spring引导在控制器@postmapping中使用动态url重新加载页面,当@valid constraints of input不满足时,显示页面上的错误

oknwwptz  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(522)

我目前正在为一个带有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();
}

它重新加载页面没有问题,但一切都消失了,它没有显示任何错误,所以这不是一个选项。
我希望这不是太多,我在网上搜索了一段时间的解决方案,但没有。
有人知道问题出在哪里吗?

4ngedf3f

4ngedf3f1#

几个小时没看到这个问题之后,我才发现我只是忘了设置一个 @ModelAttribute 姓名。下面的固定代码工作正常。

@PreAuthorize("hasRole('ADMIN')")
@GetMapping("password/{username}")
public String password(@PathVariable String username, @ModelAttribure("passwordForm") PasswordForm passwordForm) {
    passwordForm.setUsername(username);
    return "/password";
}

@PreAuthorize("hasRole('ADMIN')")
@PostMapping("/password")
public String password(@Valid @ModelAttribute("passwordForm") 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:/";
}

相关问题