You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 12:10:55