news 2026/7/14 23:16:32

springmvc 参数校验

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
springmvc 参数校验
  • 在 Web 应用三层架构体系中,表述层负责接收浏览器提交的数据,我们需要在表述层对数据进行检查,将错误的数据隔绝在业务逻辑层之外。

校验概述

  • JSR 303 是 Java 为 Bean 数据合法性校验提供的标准框架,它已经包含在 JavaEE 6.0 标准中。
  • JSR 303 通过在 Bean 属性上标注类似于 @NotNull、@Max 等标准的注解指定校验规则,并通过标准的验证接口对Bean进行验证。
注解规则
@Null标注值必须为 null
@NotNull标注值不可为 null
@AssertTrue标注值必须为 true
@AssertFalse标注值必须为 false
@Min(value)标注值必须大于或等于 value
@Max(value)标注值必须小于或等于 value
@DecimalMin(value)标注值必须大于或等于 value
@DecimalMax(value)标注值必须小于或等于 value
@Size(max,min)标注值大小必须在 max 和 min 限定的范围内
@Digits(integer,fratction)标注值值必须是一个数字,且必须在可接受的范围内
@Past标注值只能用于日期型,且必须是过去的日期
@Future标注值只能用于日期型,且必须是将来的日期
@Pattern(value)标注值必须符合指定的正则表达式
  • JSR 303 只是一套标准,需要提供其实现才可以使用。
  • Hibernate Validator 是 JSR 303 的一个参考实现,除支持所有标准的校验注解外,它还支持以下的扩展注解:
注解规则
@Email标注值必须是格式正确的 Email 地址
@Length标注值字符串大小必须在指定的范围内
@NotEmpty标注值字符串不能是空字符串
@Range标注值必须在指定的范围内
  • Spring 4.0 版本已经拥有自己独立的数据校验框架,同时支持 JSR 303 标准的校验框架。

  • Spring 在进行数据绑定时,可同时调用校验框架完成数据校验工作。

  • 在SpringMVC 中,可直接通过注解驱动@EnableWebMvc的方式进行数据校验。

  • Spring 的 LocalValidatorFactoryBean 既实现了 Spring 的 Validator 接口,也实现了 JSR 303 的 Validator 接口。只要在Spring容器中定义了一个LocalValidatorFactoryBean,即可将其注入到需要数据校验的 Bean中。

  • Spring本身并没有提供JSR 303的实现,所以必须将JSR 303的实现者的jar包放到类路径下。

  • 配置 @EnableWebMvc后,SpringMVC 会默认装配好一个 LocalValidatorFactoryBean,通过在处理方法的入参上标注 @Validated 注解即可让 SpringMVC 在完成数据绑定后执行数据校验的工作。

需要的依赖

<!-- 校验注解 --><dependency><groupId>jakarta.platform</groupId><artifactId>jakarta.jakartaee-web-api</artifactId><version>9.1.0</version><scope>provided</scope></dependency><!-- 校验注解实现--><!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator --><dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>8.0.0.Final</version></dependency><!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator-annotation-processor --><dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator-annotation-processor</artifactId><version>8.0.0.Final</version></dependency>

实体类

packagecom.cool.pojo;importjakarta.validation.constraints.Email;importjakarta.validation.constraints.Min;importjakarta.validation.constraints.NotBlank;importjakarta.validation.constraints.Past;importlombok.Data;importorg.hibernate.validator.constraints.Length;importjava.util.Date;/** * name:不为null、不为空字符串 * 字符串不为空:@NotBlank * 集合不为空:@NotEmpty * 包装类型不为空:@NotNull * * password:长度大于6 */@DatapublicclassUser{@NotBlankprivateStringname;@Length(min=6,max=20)privateStringpassword;@Min(1)privateintage;@EmailprivateStringemail;@PastprivateDatebirthday;}

controller

packagecom.cool.controller;importcom.cool.pojo.User;importorg.springframework.validation.BindingResult;importorg.springframework.validation.annotation.Validated;importorg.springframework.web.bind.annotation.*;importjava.util.HashMap;importjava.util.Map;@RestController@RequestMapping("user")publicclassUserController{/** * 步骤1:实体类属性添加校验注解 * 步骤2:handler(@Validated 实体类对象){} * 细节: * param、json 校验注解都有效果 * 只不过,json参数的话,需要用 @RequestBody 修饰形参哦! * * 这里有个天坑:如果不符合校验规则,会直接向前端抛出异常 * 解决办法: * handler(@Validated 实体类对象, BindingResult request){} * 多加一个 BindingResult request 参数, * 此参数,必须紧挨着 @Validated 实体类对象,否则此参数不管用 */@PostMapping("register")publicObjectregister(@Validated@RequestBodyUseruser,BindingResultresult){System.out.println("user= "+user);if(result.hasErrors()){// 有错误的话,就不直接返回给前端了,可以在这里自定义内容,返回给前端Mapdata=newHashMap();data.put("code",400);data.put("msg","参数校验异常");returndata;}returnuser;}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/1 9:01:48

【Linux 驱动开发】六. 中断和阻塞/非阻塞IO的实现

中断和阻塞/非阻塞IO的实现 1. 中断1.1 概念1.1.1 中断源的概念 1.2 设备树中描述中断信息1.3 中断实例---以按键为例1.3.1 在设备树中添加结点1.3.2 驱动实现 1.4 使用gpio子系统实现中断处理1.4.1 旧的gpio方式1.4.2 新的gpio方式 2. 阻塞IO和非阻塞IO的实现2.1 阻塞IO的实现…

作者头像 李华
网站建设 2026/7/13 11:07:54

如何解决 pip install 与 PyCharm 解释器版本不一致导致导入失败问题

摘要 你想解决因pip install安装包时使用的Python解释器&#xff0c;与PyCharm项目配置的解释器版本/路径不一致&#xff0c;导致在PyCharm中导入包提示ModuleNotFoundError或“Unresolved reference”的问题。这个问题是Python开发中新手高频踩坑点——核心根源是PyCharm的项…

作者头像 李华
网站建设 2026/7/13 9:46:33

赋能智慧教育:企业级智能体开发平台在个性化学习与校园管理中的应用

教育领域正寻求因材施教与规模化管理的平衡。企业级智能体开发平台为构建“AI助教”和“智能校园管理中枢”提供了技术基础&#xff0c;有望推动教学方式与教育管理的深刻变革。 一、个性化学习伙伴与智能辅导 学习智能体可以为每位学生充当“个性化学习伙伴”。它能根…

作者头像 李华
网站建设 2026/7/12 3:38:41

实现Altium许可证精细化管理的五个阶段

实现Altium许可证精细化管理的五个阶段 ——助力企业实现高效、合规的EDA资源分配在电子设计自动化&#xff08;EDA&#xff09;领域&#xff0c;Altium Designer作为一款广受欢迎的PCB设计软件&#xff0c;其许可证管理复杂度企业规模的扩大而不断提升。是在多项目、多团队协作…

作者头像 李华