当前位置: 首页 > news >正文

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;}}
http://www.cnnetsun.cn/news/819514.html

相关文章:

  • ADB调试|如何解决 ADB 安装 APK 时出现 java.lang.SecurityException 错误(Exception occurred while executing ‘install
  • Qt常用控件指南(5)
  • 基于上海钜泉科技HT7017单相计量芯片的参考例程实现
  • 书籍-陈仲金《越南通史》
  • 软件测试面试题,精选33道,面试稳了。
  • 前端小白别慌:30分钟搞懂CSS浮动布局,代码一贴就跑!
  • OpenCSG(开放传神)开源数据贡献解析:3大标杆数据集,筑牢中文AI基建
  • 解决游戏画面撕裂的5个实用技巧?
  • 60岁困境突围:失独妈妈十年阴霾,在红松小课找到人生新坐标
  • 工业大数据如何定义及其在制造业中的核心价值
  • SSM医疗门诊管理系统3g2z7(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
  • AI时代核心技能:零基础成为人工智能训练师
  • 汉字不能被毁灭!中文塞进电脑和表格,差一点失败!
  • 物业ERP管理系统技术架构解析:2026年如何用快鹭低代码与AI破解行业痛点
  • 电动绞磨优选长云科技
  • 电缆输送机价格, 哪家性价比高
  • 安达发|库存压资金,交付总延期?APS高级排产是五金厂的“救星”
  • 宏智树 AI 双降秘籍:告别降重越改越 AI 的致命误区
  • 如何快速启动gpt-oss?这个WEBUI镜像太省心了
  • 007 商务 item_search - 根据关键词获取商品列表接口对接全攻略:从入门到精通
  • 怎么实现让1台工作站共享给7人同时流畅SolidWorks设计
  • 2026年搭载率“挑战”20%!激光雷达“受益”城区NOA+L3双驱动
  • YOLO26可视化:多种绘制曲线对比图,为科研保驾护航
  • YOLO26涨点优化:红外小目标 | 注意力改进 | 多膨胀通道精炼(MDCR)模块,红外小目标暴力涨点
  • YOLO26优化:注意力魔改 | 一种新的空间和通道协同注意模块(SSCSA),充分挖掘通道和空间注意之间的协同作用
  • 构建 OpenHarmony 简易密码强度指示器:用字符串长度实现直观反馈
  • 小米MiMo-V2-Flash深度解析:国产开源大模型标杆+一步API接入全指南
  • GMV Max冷启动是什么TikTok Shop新手防断流爆单攻略
  • 多模态大模型+RAG实战:工业缺陷智能识别系统全解析
  • 智能计算芯知识:大模型开发者必学的AI专家路线图与700+专业资料