Java 中 Spring MVC 怎么结合 JSR-303 规范使用 @Valid 注解对前端入参实体执行自动表单校验

舞夢輝影

舞夢輝影

2026-08-04

137人浏览

原创

spring mvc 结合 jsr-303 通过 @valid 实现服务端自动表单校验,核心是声明约束(如 @notblank)、触发校验(@valid + bindingresult)及处理结果;需引入 validation-api 和 hibernate-validator,配置 ,并确保 bindingresult 紧跟被校验对象。

java 中 spring mvc 怎么结合 jsr-303 规范使用 @valid 注解对前端入参实体执行自动表单校验

Spring MVC 结合 JSR-303(即 Bean Validation)使用 `@Valid` 实现自动表单校验,核心在于**声明约束规则 + 触发校验机制 + 捕获并处理结果**。整个过程不依赖前端,是服务端可靠、可复用的校验方式。

校验前需准备基础依赖和配置

确保项目中包含 JSR-303 规范接口与 Hibernate Validator 实现:

  • validation-api(JSR-303 接口定义,如 @NotNull 等注解本身)
  • hibernate-validator(官方参考实现,提供具体校验逻辑)

Spring MVC 需启用校验支持:在 spring-mvc.xml 中添加

<annotation-driven></annotation-driven>

该标签会自动注册 LocalValidatorFactoryBean,无需手动配置 validator bean(除非需自定义消息源或方言)。

在实体类上标注 JSR-303 约束注解

校验目标是 Java Bean 字段,常见注解包括:

  • @NotNull:非 null(但允许空字符串)
  • @NotBlank:非 null 且 trim 后长度 > 0(专用于 String)
  • @Email:格式符合邮箱基本规范
  • @Size(min=1, max=20):适用于 String、Collection、Array 等
  • @Min(18) / @Max(120):适用于数值类型
  • @Pattern(regexp = "^[a-zA-Z0-9_]+$"):正则匹配

示例:

@Data
public class User {
    @NotBlank(message = "用户名不能为空")
    private String userName;

    @Min(0) @Max(150)
    private Integer age;

    @Email(message = "邮箱格式不合法")
    private String email;
}

Controller 方法中正确使用 @Valid 和 BindingResult

关键规则:`@Valid` 注解的参数后必须紧接一个 `BindingResult` 类型参数,否则校验失败时 Spring 会直接抛出 MethodArgumentNotValidException(导致 400 错误)。

Java JDK 25
Java JDK 25

Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。

下载

正确写法:

@PostMapping("/register")
public String register(@Valid User user, BindingResult result, Model model) {
    if (result.hasErrors()) {
        // 获取所有错误信息,例如:result.getFieldError("email").getDefaultMessage()
        model.addAttribute("errors", result.getAllErrors());
        return "register"; // 返回表单页,展示错误
    }
    userService.save(user);
    return "redirect:/success";
}

注意:BindingResult 必须紧跟在被校验对象之后,中间不能插入其他参数。

前端配合展示校验结果(可选但推荐)

使用 Spring 的表单标签库可简化错误渲染:

<form modelattribute="user" method="post">
<errors path="*" cssclass="alert alert-danger"></errors><div>
        <label>用户名:</label>
        <input path="userName"><errors path="userName" cssclass="text-danger"></errors>
</div>
    <div>
        <label>邮箱:</label>
        <input path="email"><errors path="email" cssclass="text-danger"></errors>
</div>
    <button type="submit">提交</button>
</form>

其中 path="*" 显示全局错误,path="fieldName" 显示字段级错误。

进阶:嵌套对象与分组校验

若实体含关联对象(如 User 包含 Address address),需在嵌套字段上加 @Valid 才能递归校验:

public class User {
    @Valid // 触发 Address 内部校验
    private Address address;
}

如需不同场景不同规则(如新增 vs 修改),可用校验分组:

  • 定义分组接口:public interface Update {}
  • 字段指定分组:@NotBlank(groups = Update.class)
  • Controller 中使用:@Validated(Update.class) User user
不复杂但容易忽略

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1062

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

2187

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

2080

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

2229

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

333

5

java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

3721

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

2753

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

2777

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

635

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Spring中文手册
Spring中文手册

共0课时 | 0.6万人学习

马士兵spring视频教程
马士兵spring视频教程

共25课时 | 9.7万人学习