Spring MVC 推荐使用 JSR-303/JSR-380 注解(如 @NotNull、@Email)配合 @Valid 和 BindingResult 实现表单校验;需引入 spring-boot-starter-validation 依赖;支持自定义注解(如 @PasswordMatch)校验跨字段逻辑。

在 Spring MVC 中,可以通过注解 + Validator 接口或更常用的 JSR-303/JSR-380(即 Bean Validation)标准 来校验前端表单数据。推荐使用基于注解的方式(如 @NotNull、@Size 等),配合 @Valid 或 @Validated 触发校验,并用 BindingResult 捕获错误。
添加依赖(确保支持 Bean Validation)
Spring Boot 项目通常已内置 spring-boot-starter-validation(对应 Hibernate Validator)。若非 Spring Boot 或版本较老,需显式引入:
- Maven 依赖(Spring Boot 2.3+ 已将 validation 拆出,需单独加):
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
定义带校验规则的实体类
在接收表单数据的 DTO 或实体类字段上添加校验注解:
PigX UI Pro 前端开发指南 - Vue 3 + TypeScript + Element Plus。当用户提到 PigX UI、PigX 前端、lgb-mgui 项目、Vue 3 企业级后台开发、Element Plus 后台开发时使用此技能。
@NotBlank(message = "用户名不能为空")
private String username;
@Email(message = "邮箱格式不正确")
private String email;
@Min(value = 18, message = "年龄不能小于18")
private Integer age;
@Pattern(regexp = "^1[3-9]\d{9}$", message = "手机号格式不正确")
private String phone;
// getter/setter 省略
}
在 Controller 中启用校验并处理结果
使用 @Valid 注解参数,并紧随其后声明 BindingResult(顺序不能错):
立即学习“Java免费学习笔记(深入)”;
@PostMapping("/register")public String register(@Valid UserForm form, BindingResult result, Model model) {
if (result.hasErrors()) {
// 获取所有错误信息(可转成 List 或 Map 返回给前端)
List
.map(e -> e.getDefaultMessage())
.collect(Collectors.toList());
model.addAttribute("errors", errors);
return "register"; // 返回原页面展示错误
}
// 校验通过,执行业务逻辑
userService.save(form);
return "redirect:/success";
}
自定义校验注解(进阶需求)
当内置注解不够用时(例如“密码和确认密码必须一致”),可自定义约束注解:
- 定义注解接口(如
@PasswordMatch) - 实现
ConstraintValidator<PasswordMatch, Object> - 在目标类上标注该注解(注意:要作用于类级别,而非字段)
示例关键点:
– 注解需标注 @Constraint(validatedBy = PasswordMatchValidator.class)
– PasswordMatchValidator 中通过反射获取两个字段值比对
– 目标类上加 @PasswordMatch,并在类中提供 password 和 confirmPassword 字段

















