Spring Boot中使用Thymeleaf展示表单校验错误信息失效问题求助
问题根因
你当前的校验注解加在了JPA实体类BitUser上,但Controller层接收表单参数的是BitUserRegistrationDto对象,DTO上没有配置任何校验规则,所以Controller层的@Valid不会触发校验,请求会直接进入业务层,调用持久化逻辑时Hibernate会对BitUser实体做校验,此时抛出的异常没有被捕获,直接返回500错误。
修改步骤
1. 给BitUserRegistrationDto添加校验注解
把原来写在BitUser实体类上的校验规则移到DTO上,代码如下:
package bitsTracker.entity; import lombok.Data; import javax.validation.constraints.Email; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; @Data public class BitUserRegistrationDto { @NotEmpty(message = "姓名不能为空") private String name; @NotEmpty @NotNull @Size(min=2, message ="用户名长度不能小于2位") private String userName; @Email(message = "请输入合法的邮箱地址") @NotNull @NotEmpty private String email; @NotEmpty @NotNull @Size(min = 8 , message ="密码最少8位,需包含至少1个数字和特殊字符") private String password; }
2. 引入校验依赖(如果未引入)
Spring Boot 2.3及以上版本默认没有集成校验模块,需要手动引入依赖,Maven配置如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
3. 可选:关闭Hibernate自动校验
如果BitUser实体类上需要保留校验注解用于其他场景,可以在application.properties中关闭Hibernate持久化时的自动校验,避免重复校验抛出异常:
spring.jpa.properties.javax.persistence.validation.mode=none
修改完成后,Controller层接收表单参数时就会自动触发校验,错误信息会存入BindingResult对象,返回表单页后Thymeleaf就能正常渲染错误提示。
内容的提问来源于stack exchange,提问作者Anas
相关产品推荐
相关产品推荐

