【发布时间】:2020-11-16 02:45:42
【问题描述】:
我将 Spring Boot 2.3.1 和 Thymeleaf 用于一个简单的注册应用程序,因此用户可以创建 Member 模型并将其保存到数据库中。我正在使用javax.validation 框架来确保字段不为空,并且在模型有效时它可以正常工作,但是缺少字段的无效模型会将我踢出,并在我的默认error.html 页面上显示 400 错误代码,而不是将用户带回注册表单,我可以在其中显示字段级错误(例如,“需要用户名”)。
模型很简单,看起来像这样:
@Entity
@Table(name="member")
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
@Email
@NotEmpty
private String username;
@NotEmpty
@Column(name="password", nullable = false)
private String password;
// ... getters and setters
控制器如下所示:
@PostMapping("/register")
public ModelAndView registerMember(HttpServletRequest request, HttpServletResponse response,
@ModelAttribute @Valid Member member, ModelMap model, BindingResult result){
log.info("Attempting to register a user");
// some other error checking not related to javax.validation ...
memberService.save(member);
return new ModelAndView("/success", model);
}
最后,(简化的)HTML/Thymeleaf 表单看起来像这样(register.html):
<form th:action="@{/register}" th:object="${member}" method="post">
<input type="text" class="form-control" placeholder="Email" id="username" th:field="*{username}">
<input type="password" placeholder="Enter your Password" id="password" class="form-control" th:field="*{password}">
<input type="submit" class="btn btn-primary btn-block btn-login">
</form>
在表单提交时使用username 和password 的值一切正常,但如果我省略其中任何一个,例如username,我会得到以下WARN 日志语句:
Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 4 errors
Field error in object 'member' on field 'username': rejected value []; codes [NotEmpty.member.username,NotEmpty.username,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [member.username,username]; arguments []; default message [username]]; default message [must not be empty]
但随后服务器返回 400 错误并呈现 error.html 页面而不是返回到表单,同样重要的是我在控制器中的 registerMember() 方法根本没有被调用。它完全通过了我的逻辑,所以我什至无法使用 BindingResult 手动检查错误。
如果我在我的模型上省略了@Valid 注释,比如@ModelAttribute Member member,那么我的方法会被调用,但没有使用任何javax.validation,而BindingResult.getErrorCount() 是0,因此无法使用它(我必须手动验证自己)。
知道如何让@Valid 完成其工作并返回/register 端点以显示字段级错误吗?
【问题讨论】:
标签: java spring spring-boot validation thymeleaf