文章目录

  • Pre
  • 概述
  • 三部曲
    • Step1 搞自定义注解
    • Step2 搞校验逻辑
    • Step3 使用
    • Step4 验证
  • 附 int 类型的判断
  • 源码


Pre

SpringBoot - 优雅的实现【参数校验】高级进阶

SpringBoot - 优雅的实现【自定义参数校验】高级进阶

SpringBoot - 优雅的实现【参数分组校验】高级进阶

SpringBoot - 使用Assert校验让业务代码更简洁


概述

接上文, Spring Validation 提供的注解基本上够用,但是复杂的校验,我们还是需要自己定义注解来实现自动校验。

举个例子: 实体类中的sex性别属性 , 只能输入 M 、 F 这2个枚举值


三部曲

Step1 搞自定义注解

package com.artisan.customvalidator;import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;/*** @author 小工匠* @version 1.0* @mark: show me the code , change the world*/@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Repeatable(EnumString.List.class)
@Documented
@Constraint(validatedBy = EnumStringValidator.class)//标明由哪个类执行校验逻辑
public @interface EnumString {String message() default "value not in enum values.";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};/*** @return date must in this value array*/String[] value();/*** Defines several {@link EnumString} annotations on the same element.** @see EnumString*/@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})@Retention(RUNTIME)@Documented@interface List {EnumString[] value();}
}

Step2 搞校验逻辑

package com.artisan.customvalidator;import lombok.extern.slf4j.Slf4j;import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Arrays;
import java.util.List;/*** @author 小工匠* @version 1.0* @mark: show me the code , change the world*/
@Slf4j
public class EnumStringValidator implements ConstraintValidator<EnumString, String> {private List<String> enumStringList;@Overridepublic void initialize(EnumString constraintAnnotation) {log.info("EnumStringValidator initialize.....");enumStringList = Arrays.asList(constraintAnnotation.value());}@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {if (value == null) {return true;}return enumStringList.contains(value);}
}

Step3 使用

在字段上增加注解

Step4 验证


附 int 类型的判断

package com.artisan.customvalidator;import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;/*** @author 小工匠* @version 1.0* @Des 扩展int枚举校验* @mark: show me the code , change the world*/
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Repeatable(EnumInteger.List.class)
@Documented
@Constraint(validatedBy = EnumNumberValidator.class)
public @interface EnumInteger {String message() default "value not in enum values.";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};/*** @return date must in this value array*/int[] value();/*** Defines several {@link EnumInteger} annotations on the same element.** @see EnumInteger*/@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})@Retention(RUNTIME)@Documented@interface List {EnumInteger[] value();}
}
package com.artisan.customvalidator;import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.ArrayList;
import java.util.List;/*** @author 小工匠* @version 1.0* @mark: show me the code , change the world*/
public class EnumNumberValidator implements ConstraintValidator<EnumInteger, Number> {private List<Integer> enumStringList;@Overridepublic void initialize(EnumInteger constraintAnnotation) {enumStringList = new ArrayList<>();int[] values = constraintAnnotation.value();for (int value : values) {enumStringList.add(value);}}@Overridepublic boolean isValid(Number value, ConstraintValidatorContext context) {if (value == null) {return true;}return enumStringList.contains(value.intValue());}
}

源码

https://github.com/yangshangwei/boot2

SpringBoot - 优雅的实现【自定义参数校验】高级进阶相关推荐

  1. SpringBoot - 优雅的实现【参数校验】高级进阶

    文章目录 Pre 概述 参数校验三部曲 Step1 搞依赖 Step2 搞参数校验的实体类 常用的校验注解 Step3 开始验证 存在的问题 使用 统一格式 + 全局异常Handler 优化 源码 P ...

  2. SpringBoot - 优雅的实现【参数分组校验】高级进阶

    文章目录 Pre 需求 实现三部曲 Step1 定义分组接口 Step2 给参数分配分组 Step3 指定分组 Step4 验证 源码 Pre SpringBoot - 优雅的实现[参数校验]高级进阶 ...

  3. SpringBoot - 优雅的实现【业务校验】高级进阶

    文章目录 Pre 需求 实现三部曲 实体类 Step1 搞两个自定义注解 Step2 搞自定义校验器 Step3 搞验证 小结 源码 Pre SpringBoot - 优雅的实现[参数校验]高级进阶 ...

  4. e0312 不存在用户定义的_更加灵活的参数校验,Spring-boot自定义参数校验注解

    上文我们讨论了如何使用@Min.@Max等注解进行参数校验,主要是针对基本数据类型和级联对象进行参数校验的演示,但是在实际中我们往往需要更为复杂的校验规则,比如注册用户的密码和确认密码进行校验,这个时 ...

  5. SpringBoot实现通用的接口参数校验

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:cipher juejin.im/post/5af3c25b ...

  6. springboot+dubbo+validation 进行 rpc 参数校验

    注意:本文dubbo 版本 2.8.4 springboot 版本 2.0.4.RELEASE 项目结构 test-rest (前端消费着,controller 层,springboot+maven项 ...

  7. Spring Mvc Controller返回值、参数绑定、参数校验 (高级二)

    1,Controller 返回值 返回moduleAndView 返回 String 返回void 2,Controller 参数绑定 客户端请求携带的key/value 键值对 绑定到 Contro ...

  8. 自定义检验注解_多注解自定义参数校验

    好久直接更新了单个注解参数校验以后.偷懒了好久,今天就把多个注解自定义的参数校验写了一下,思路是一样的,只是一个注解包含的字段把它分解成了多个注解,类似于java-valid自带的不同功能的校验注解一 ...

  9. SpringBoot使用Validation框架完成参数校验AND异常处理

    关于Validation框架:(官方简介) 在任何时候,当你要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情.应用程序必须通过某种手段来确保输入进来的数据从语义上来讲是正确的.在通常的 ...

最新文章

  1. sql增删改查_增删改查!sql2pandas方法手册
  2. Linux内核学习--内存管理模块
  3. 输入输出 scanf和*修饰符
  4. mysql创建表和数据库
  5. jQuery中each和js改变this指向
  6. wxWidgets:wxBannerWindow类用法
  7. 深入浅出Mysql(四)
  8. strlen 与 sizeof
  9. 把列表变成列向量_线性代数的本质11 抽象向量空间
  10. oracle查看物化视图的索引,oracle – 物化视图中的域索引返回零行
  11. linux命令 recv阻塞时间,linux下close 掉socket 之后 阻塞的recv 不会立即返回
  12. HTML+CSS制作彩色波动
  13. 【图像融合】拉普拉斯金字塔融合
  14. 微软新开源!不用写 1 行代码的自动化测试工具
  15. ZOJ3554 A Miser Boss(dp)
  16. 5G来临,一对一直播社交源码如何利用热门机制吸引万千用户?
  17. 为什么CPU的使用率总是100%
  18. html怎么定义音乐参数,AudioParam - 表示与音频相关的参数
  19. cuda compute capability
  20. C++ 小游戏 视频及资料集(十)

热门文章

  1. 分拣外观残缺的机器人_中国鞋业高峰论坛大咖云集,国辰机器人解读“鞋业智造”...
  2. 《基于张量网络的机器学习入门》学习笔记5
  3. python wlile
  4. 如何把二进制数化成十进制数_二进制数按位进行逻辑运算
  5. 论文笔记:Hankel Matrix Factorization for Tagged Time Series to Recover Missing Values during Blackouts
  6. Data Mining 论文翻译:Deep Learning for Spatio-Temporal Data Mining: A Survey
  7. pytorch 笔记: torch.nn.Embedding
  8. MATLAB实战系列(二十九)-头脑风暴优化(BSO)算法求解旅行商问题(TSP)-交叉算子
  9. R语言实战应用精讲50篇(八)-随机区组设计资料的方差分析
  10. 产品经理必备知识之网页设计系列(三)-移动端适配无障碍设计及测试