【优雅的参数验证@Validated】@Validated参数校验的使用及注解详解——你还在用if做条件验证?

68 篇文章 8 订阅
订阅专栏

你还在用if做条件验证吗?

请先看看下面代码:(简单举个例子,代码并不规范)

    @ApiOperation("新增用户")
    @PostMapping("/addUser")
    public ResultVo insert(@ApiParam("用户信息实体") @RequestBody User user){
        if(user.getUserName!=null){
           throw new BusinessException("用户名称不能为空");
        }
        if(user.getUserPhone!=null){
           throw new BusinessException("用户电话不能为空");
        }
        if( user.getUserPhone().length()){
           throw new BusinessException("用户电话格式不规范");
        }
        return new ResultVo(userService.insert(user));
    }

以上代码主要是为了对用户user实体进行条件验证。
但是那么多的if, 写得纯纯得小白一个,也使得代码显得臃肿不美观不优雅!
接下来,让我们学习使用优雅的参数验证@Validated!

一、优雅的参数验证@Validated

@Valid和@Validated是Spring Validation框架提供的参数验证功能。

1.@Valid和@Validated的用法(区别)

二者主要作用在于 都作为标准JSR-303规范,在检验Controller的入参是否符合规范时,使用@Validated或者@Valid在基本验证功能上没有太多区别。但是在分组、注解地方、嵌套验证等功能上两个有所不同:

@Valid:
@Valid注解用于校验,所属包为:javax.validation.Valid。

用在方法入参上无法单独提供嵌套验证功能。**能够用在成员属性(字段)**上,提示验证框架进行嵌套验证。能配合嵌套验证注解@Valid进行嵌套验证。

@Validated:
@Validated是@Valid 的一次封装,是Spring提供的校验机制使用。

用在方法入参上无法单独提供嵌套验证功能。不能用在成员属性(字段)上,也无法提示框架进行嵌套验证。能配合嵌套验证注解@Valid进行嵌套验证。

2.引入并使用@Validated参数验证

  1. 引入校验的依赖包
        <!--第一种方式导入校验依赖:使用springboot时,在org\springframework\spring-context\5.2.1.RELEASE\spring-context-5.2.1.RELEASE.jar-->
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!--第二种方式导入校验依赖-->
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.1.Final</version>
        </dependency>
        <!--第三种方式导入校验依赖-->
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
        </dependency>
  1. 找到自己的实体类定义自己要校验的参数
    在这里插入图片描述

3.在controller的入参处添加@Validated注解(@Validated可以指定groups区别验证,@Valid不可以指定groups,见上面二者区别)

@Validated(addGroup.class)就是给参数进行了分组校验

    @ApiOperation("新增用户")
    @PostMapping("/addUser")
    public ResultVo insert(@ApiParam("用户信息实体") @Validated(addUser.class) @RequestBody User user){
        return new ResultVo(userService.insert(user));
    }

那么addGroup.class是哪里来的??什么作用?
addGroup.class:是一个接口类,简单的来说:就是用来给参数做标记的(里面不需要写任何代码)
在这里插入图片描述

到这里基本的使用就结束了!

二、javax.validation.constraints下参数条件注解详解

实现参数验证功能,我们需要@Validated注解配合 在实体类的的参数加上条件验证注解(设置具体的条件限制规则)一起实现参数验证功能。

而这些参数条件注解是由javax.validation.constraints包下提供,主要如下:

  1. @NotNull :被注解的元素必须不为null

  2. @NotBlank注解 :验证注解的元素值不为空(不为null、去除首位空格后长度为0) ,并且类型为String。

  3. @NotEmpty注解 :验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) ,并且类型为String。

  4. @AssertTrue注解 :被注解的元素必须为true,并且类型为boolean。

  5. @AssertFalse注解 :被注解的元素必须为false,并且类型为boolean。

  6. @Min注解 :被注解的元素其值必须大于等于最小值,并且类型为int,long,float,double。

  7. @Max注解:被注解的元素其值必须小于等于最小值,并且类型为int,long,float,double。

  8. @DecimalMin注解 :验证注解的元素值大于等于@DecimalMin指定的value值,并且类型为BigDecimal。

  9. @DecimalMax注解 :验证注解的元素值小于等于@DecimalMax指定的value值 ,并且类型为BigDecimal。

  10. @Range注解 :验证注解的元素值在最小值和最大值之间,并且类型为BigDecimal,BigInteger,CharSequence,byte,short,int,long。

  11. @Past注解 :被注解的元素必须为过去的一个时间,并且类型为java.util.Date。

  12. @Future注解 :被注解的元素必须为未来的一个时间,并且类型为java.util.Date。

  13. @Size注解 :被注解的元素的长度必须在指定范围内,并且类型为String,Array,List,Map。

  14. @Length注解 :验证注解的元素值长度在min和max区间内 ,并且类型为String。

  15. @Digits注解 :验证注解的元素值的整数位数和小数位数上限 ,并且类型为float,double,BigDecimal。

  16. @Pattern注解 :被注解的元素必须符合指定的正则表达式,并且类型为String。

  17. @Email注解: 验证注解的元素值是Email,也可以通过regexp和flag指定自定义的email格式,类型为String。

三、自定义条件注解

如果在写项目的过程中,参数需要的条件注解满足不上,则我们需要自定义注解来完成

步骤:

1.创建一个自定义的注解类

/**自定义条件注解
 * @author: wxh
 * @version:v1.0
 * @date: 2022/11/14 22:39
 */
@Target({ElementType.FIELD,ElementType.METHOD,ElementType.ANNOTATION_TYPE,ElementType.CONSTRUCTOR,ElementType.PARAMETER,ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {ListValueConstraintValidator.class})
public @interface ListValue {
    //配置路径,后端传递信息
    String message() default "{com.itfuture.e.valid.ListValue.message}";
    
    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    //自定义一个类型来存放数据(数组)
    int[] values() default {};

}

2.创建一个逻辑处理数据的方法

/**自定义显示状态
 * @author: wxh
 * @version:v1.0
 * @date: 2022/11/14 22:49
 */
public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> {
    //set存储
    private Set<Integer> set = new HashSet<>();

    //初始化数据
    //listValue拿到的是注解中的数据
    @Override
    public void initialize(ListValue constraintAnnotation) {
        //拿到注解中自定义的数据,且是数组型的
        int[] values = constraintAnnotation.values();
        //放在数组里,遍历判断
        for(int value:values){
            set.add(value);
        }
    }

    //判断数据是否相同
    @Override
    public boolean isValid(Integer integer, ConstraintValidatorContext constraintValidatorContext) {
        if(set.contains(integer)){
            return true;
        }
        return false;
    }
}

3.String message() default “{com.atguigu.common.valid.ListValue.message}”;

这个消息:message() default "{com.atguigu.common.valid.ListValue.message}"也可以通过配置文件去配置:
在这里插入图片描述

4.在实体类的参数条件中来调用:

在这里插入图片描述

至此,参数验证基本完述!

Java实战】使用自定义注解实现参数校验详解
~~~~~~~BUG FLY~~~~~~~~~
04-19 2877
由于实际开发中遇到大量相同的条件参数验证,不想写重复代码及让代码看起来更加优雅简洁,所以决定使用自定义注解进行参数校验Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能,注解相关类都包含在java.lang.annotation包中其中参数校验注解来自三方面,分别是javax.validation:validation-api,对应包javax.validation.constraints。
java中Long类型传参校验注解_JAVA——实现json bean实体类的传参校验模板及注解详解...
weixin_34175388的博客
02-26 2667
关注wx:CodingTechWork,一起学习进步。引言在java开发中,经常需要和外界系统进行参数对接,api设计中难免会遇到json传参不一致的情况,虽然纸面或者接口规范约束了应该怎么传参,仍然不可避免在对接过程中,出现传参不符合要求的,如传空值、传超过范围的值等。除了在Controllers层面使用@Validated或者@Valid注解外,本文将总结使用javax.validation....
SpringBoot2.0之四 @Validated注解校验
sinat_31986807的博客
08-22 162
Spring Boot中,@Validated注解用于验证请求参数。它可以应用在Controller类或方法上。
springmvc的@Validated注解使用
08-25
主要介绍了springmvc的@Validated注解使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
SpringBoot 中利用@Valid和@Validated进行参数校验
最新发布
weixin_47087489的博客
09-01 793
例如在某个登录请求中传递参数包含用户信息,需要判断用户信息是否为空,以及判断邮箱是否为空等情况正常处理会写大量的If else 语句非常影响美观可读性也非常低,因此提出了参数校验这个概念也就是下文介绍的@Valid和@Validated注解// 进行某种操作// 进行某种操作。
spring注解参数校验
dejianqiu6073的博客
12-13 348
很痛苦遇到大量的参数进行校验,在业务中还要抛出异常或者 返回异常时的校验信息,在代码中相当冗长,今天我们就来学习spring注解参数校验. 其实就是:hibernate的validator. 开始啦...... 1.controller的bean加上@Validated就像这样 1 @ApiOperation(value = "用户登录接口", notes = "...
@Validated使用
m0_64497559的博客
06-29 471
出于对前端传递参数校验是否为空或者是否是空字符串,传统的if()else{}方法过于难受,每次都需要占用大量的代码,很不优雅,因此搜索找到@Validated用法来优化代码。
@Validated注解的作用及用法
qq_54426630的博客
05-30 1059
在这个例子中,submitFormGroup1方法只会验证属于Group1组的约束,而submitFormGroup2方法只会验证属于Group2组的约束。:你也可以在控制器类上使用@Validated,以便对该控制器中的所有请求处理方法启用验证。:@Validated注解可以与验证组一起使用,以便在不同的场景下应用不同的验证规则。:@Validated注解通常用于控制器的方法参数上,以启用该参数验证功能。在这个例子中,createUser方法的User参数会在方法调用时进行验证
@Validated参数
08-13
- *1* *2* *3* [【优雅参数验证@Validated】@Validated参数校验使用注解详解——你还在用if条件验证?](https://blog.csdn.net/weixin_43431218/article/details/127870470)[target="_blank" data-report-...
@Validated使用详解
04-28
@ValidatedSpring 提供的一种数据校验注解,它可以对方法参数进行校验。它是在 Bean Validation 的基础上进行了扩展,可以在 Spring使用使用方法如下: 1. 添加依赖 ``` <groupId>org.spring...
@validated注解使用
08-13
3. 在被校验的实体类的属性上使用相应的校验注解,例如@NotNull、@NotBlank、@Min等。 例如,可以在Controller的方法参数使用@Validated注解进行参数校验,如下所示: ```java @PostMapping("/example") public ...
Validated校验
a14654的博客
06-23 393
JavaWeb项目参数合法性校验 目前Web项目校验参数合法性时,经常用到@Validated、@Valid等,下面总结下各种情况下的使用。 情景1 @Data @AllArgsConstructor @NoArgsConstructor public class TableColumnBO { @NotBlank(message = "表名不能为空") private String tableName; @NotBlank(message = "字段名不能为空") pri
SpringBoot参数校验@Valid 和 @Validated注解使用详解
Charge8的博客
04-03 5785
SpringBoot参数校验@Valid 和 @Validated注解使用详解
@Validated用法
weixin_30163735的博客
07-13 4200
@validated用法
springMVC 优雅校验参数(@Valid和@Validated
ratel的博客
09-20 6271
很痛苦遇到大量的参数进行校验,在业务中还要抛出异常或者不断的返回异常时的校验信息,在代码中相当冗长, 充满了if-else这种校验代码,今天我们就来学习springjavax.validation 注解参数校验. 为什么要用validator javax.validation的一系列注解可以帮我们完成参数校验,免去繁琐的串行校验 不然我们的代码就像下面这样: // http://loc...
参数校验框架】@Valid 的常规使用
Rambo's Blog
03-13 615
文章目录一、框架引入二、校验场景三、框架使用 一、框架引入 Spring 框架已经集成了 @Valid 注解,可以在 Hibernate Validator 时触发校验,并且支持校验 javax 和 Hibernate 的注解 还能将校验结果绑定到 BindingResult 类上,我们可以拿到校验结果去自定义处理,或者直接抛出 Exception 或者自定义异常 二、校验场景 用户注册场景 用户名、密码和手机号码不能为空 密码长度限制 8 ~ 10 手机号码要正则校验
Spring MVC JSR303数据校验
古怪的小窝
06-23 843
spring MVC 数据教研挺容易的。。。。JSR303 只要把校验规则用注解写在javaBean上就可以了 规则如下: 空检查 @Null 验证对象是否为null @NotNull 验证对象是否不为null, 无法查检长度为0的字符串 @NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格. @NotEmpt
接口参数检验@Valid & @Validated
qq_33753147的博客
01-16 2617
@Valid & @Validated 参数校验
写文章

热门文章

  • GitHub访问慢:分享两个镜像加速网站 43323
  • 【Hugggingface.co】关于huggingface.co无法访问&大模型下载运行报错解决We couldn‘t connect to ‘https://huggingface.co‘ to. 42439
  • XMind使用卡顿,不流畅!一招解决! 39999
  • 【优雅的参数验证@Validated】@Validated参数校验的使用及注解详解——你还在用if做条件验证? 36568
  • IDEA运行缓慢卡顿,解决idea卡顿,控制台中文乱码 以及其它常用设置 32902

分类专栏

  • AI前沿技术 13篇
  • LeetCode算法刷题 19篇
  • Java学习知识总结 68篇
  • 编程笔记(问题解决) 100篇
  • 数据库 35篇
  • 架构 12篇
  • 前端技术栈 4篇
  • 操作系统 8篇
  • 数据分析 7篇
  • 项目实战 1篇
  • 面试 3篇
  • 看图学技术 9篇
  • python 7篇
  • Golang
  • Cloud云原生 12篇
  • Shell脚本 1篇
  • 部署&Linux运维 64篇

最新评论

  • 【Hugggingface.co】关于huggingface.co无法访问&大模型下载运行报错解决We couldn‘t connect to ‘https://huggingface.co‘ to.

    哒哒哒329: 方法一简单有效,字面意思国内网络进不去,想办法进去打开网址就行(科学上网)

  • 【Parsec】一款安全高效的远程桌面软件

    点量云实时渲染-小芹: DoLink内信互联也是优先使用P2P,且团队在十五年前就是专注P2P传输的。如果考虑企业自建远程软件系统,建议内信互联

  • 【Hugggingface.co】关于huggingface.co无法访问&大模型下载运行报错解决We couldn‘t connect to ‘https://huggingface.co‘ to.

    swuwhy: 设置一下http的通道 git clone 走代理:git config --global http.proxy "localhost:7890" 或者试一下走SSH的命令,我是后面这种下载到的....

  • XMind使用卡顿,不流畅!一招解决!

    铏尘: 我改完还卡啊,今天又未响应了,能再改大点吗表情包

  • docker启动失败:failed to create task for container:... not a directory: unknown: Are you trying to mount

    准时睡觉(超级努力版: 成功解决了问题,谢谢

最新文章

  • 【健康小帖】长时间伏案引起颈椎疼痛以及颈椎病变引起的一系列症状缓解方法
  • 【Parsec】一款安全高效的远程桌面软件
  • 使用Docker和Macvlan驱动程序模拟跨主机跨网段通信
2024
10月 2篇
09月 3篇
08月 10篇
07月 6篇
06月 8篇
05月 4篇
04月 2篇
03月 10篇
02月 4篇
01月 10篇
2023年92篇
2022年45篇
2021年61篇
2020年7篇
2019年1篇

目录

目录

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Itfuture03

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家知名玻璃钢雕塑价格行情济源玻璃钢浮雕不锈钢景观雕塑沈阳定制玻璃钢雕塑销售厂家佛山玻璃钢彩绘大熊猫雕塑南阳大型玻璃钢仿铜雕塑揭阳欧式玻璃钢卡通雕塑鹤岗舞台道具商场美陈玻璃钢热气球雕塑图片北京铅色斜纹玻璃钢花盆上海铭将玻璃钢雕塑厂成都雕塑玻璃钢人物玻璃钢动物雕塑销售方法运动人物雕塑玻璃钢哈尔滨玻璃钢龙虾雕塑倾销玻璃钢花盆直销郑州标识玻璃钢景观雕塑酒桶玻璃钢卡通雕塑订做深圳特色商场美陈供应商玻璃钢漆雕塑工具个旧玻璃钢雕塑重庆景区玻璃钢雕塑供应商江西高质量玻璃钢雕塑设计张家界动物玻璃钢雕塑定做石河子景区玻璃钢雕塑鸡西景区玻璃钢雕塑定制美陈商场门头瓯海玻璃钢雕塑厂家东城区商场美陈创意桐乡玻璃钢雕塑联系方式铸铜玻璃钢彩绘雕塑制造香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化