Thymeleaf无法显示自定义及@Size校验错误信息的问题求助
问题原因分析
核心问题是模型属性名称与BindingResult绑定的对象名称不匹配:
- Spring MVC中,未指定
@ModelAttribute名称时,默认使用类名首字母小写(RequestUserDto对应requestUserDto) - 你在
GetMapping中把对象存入模型时用的是userDto,但PostMapping中校验错误会绑定到默认的requestUserDto上,导致Thymeleaf的#fields无法找到对应错误。
另外,你在错误处理时重复添加userDto到模型的操作,反而会干扰Spring自动关联的BindingResult与模型对象的绑定关系。
解决方案
1. 统一模型属性名称
修改PostMapping的@ModelAttribute,显式指定名称为userDto,与GetMapping保持一致:
@PostMapping(USER_REGISTER_URL) public String regUser(@Valid @ModelAttribute("userDto") final RequestUserDto userDto, final BindingResult bindingResult, final Model model) { if (bindingResult.hasErrors()) { // 移除以下两行冗余代码:@ModelAttribute已自动将userDto放入模型,BindingResult已关联错误 // model.addAttribute("userDto", userDto); // model.addAttribute("errors", bindingResult.getAllErrors()); return USER_REGISTER_PAGE; } userService.createUser(userDto); return LOGIN_PAGE_REDIRECT; }
2. 确认DTO字段注解正确性
确保RequestUserDto中的字段正确标注校验注解:
public class RequestUserDto { // 自定义密码校验注解 @Password private String password; // @Size注解示例 @Size(min = 10, max = 50, message = "长度必须在10到50之间") private String firstName; // 其他字段及getter/setter }
3. (可选)完善国际化消息配置
如果使用国际化消息,确保messages.properties(或对应语言的配置文件)中存在messages.validation.password的配置:
messages.validation.password=密码格式不正确:长度需8-100位,至少包含2个大写字母、2个小写字母、1个特殊字符
若不需要国际化,可直接在@Password注解中写死提示文本:
@Password(message = "密码格式不正确:长度需8-100位,至少包含2个大写字母、2个小写字母、1个特殊字符")
4. 验证依赖与版本兼容性
确保项目已引入Spring Boot校验依赖:
<!-- Maven --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
同时保证Thymeleaf版本与Spring Boot版本兼容(Spring Boot 3.x对应Thymeleaf 3.1+)。
内容的提问来源于stack exchange,提问作者NONAME
相关产品推荐
相关产品推荐

