Spring Validation

概念

在原先的编码中,我们如果要验证前端传递的参数,一般是在接受到传递过来的参数后,手动在代码中做 if-else 判断,这种编码方式会带来大量冗余代码,十分的不优雅。
因此,推出了用注解的方式,来代替手动判断的方式,让编码更加的简洁。

使用方式

引入注解:
一般在

        org.springframework.boot            spring-boot-starter-web        

依赖中会有相关依赖,如果没有的话,可以手动引入下面的依赖。

    org.hibernate.validator      hibernate-validator      6.0.18.Finalcompile

get

针对 get 方式的请求,我们的请求参数直接放在参数列表里,因此直接在参数列表里加上想要验证的注解即可。

  @GetMapping("xss")    public void xssGet(@RequestParam("xss1") @Size(min = 1,max = 15,message = "长度不对") String xss, HttpServletRequest request) {          }

在方法中,需要验证 xss 参数是否符合长度规范,即长度在 1-15 个字符之间,如果不对,则会提示出信息:长度不对。

post

在 post 方法中,传递的参数一般比较多,因此大多数情况下,采用的是传递的实体类的形式,然后用 json 的形式来传递数据,在这种情况下,使用的方式为构建一个实体类,然后在实体类的属性上添加注解来做。

@Datapublic class SaveEmployeeParam implements Serializable {    private static final long serialVersionUID = 8176094330224588795L;    @NotEmpty    private String Id;    @Size(max = 15, message = "名称必填,且最多为15个汉字")    private String nickname;    @PhoneValidationAnnotation    private String phone;}    @PostMapping    public ResultEntity saveEmployee( @Valid @RequestBody SaveEmployeeParam saveEmployeeParam) {        employeeService.saveEmployee(saveEmployeeParam);        return ResultEntity.success();    }

通过该方式,在验证 SaveEmployeeParam 时,框架就会自动在接受参数时,验证实体类中的值是否符合注解定义的规范。
在这里,就会验证 id 不能为空,nickname 的长度最多15个字符,以及我在手机号上添加了一个自定义注解,在确保其符合手机号规范。

分组校验

有时,我们的一个实体类可能会在多种情况下使用,而又不想每种情况都定义一个实体类,则可以采用分组校验的方式,在不同的情况下,采用不同的校验方案。
首先自定义几种不同情况下的接口:

public interface Create {}public interface Update {}

然后在指定的 pojo 上指定不同的情况下的策略:

@Datapublic class Demo {    @Size(max = 15, groups = Create.class)    @Size(max = 10, groups = Update.class)    private String name;        @Max(value = 100, groups = Create.class)    @Max(value = 20, groups = Update.class)    private Integer age;}

最后,在不同的方法上,根据业务需要指定使用不同的策略即可:

    @PostMapping("xss3")    public String xssPost(@Validated({Create.class}) @RequestBody Demo xss3) {        return JSON.toJSONString(xss3);    }    @PutMapping("xss4")    public String xssUpdate(@Validated({Update.class}) @RequestBody Demo xss4) {       return JSON.toJSONString(xss4);    }

在这种情况下,则在执行 xssPost() 方法时,采用是 Create 的执行方案,在执行 xssUpdate() 方法时,采用的是 Update 方案。

提供的全部注解

JSR提供的校验注解:@Null必须为 null@NotNull必须不为 null@AssertTrue必须为 true@AssertFalse必须为 false@Min(value)大于等于 给定数字@Max(value)小于等于 给定数字@DecimalMin(value)大于等于 给定数值@DecimalMax(value)小于等于 给定数字@Size(max=, min=)集合或字符串长度在指定范围内@Digits指定整数部分和小数部分可以接受的最大位数@Past必须为一个过去的时间@Future必须为一个未来的时间@Pattern(regex=,flag=)给定字符串符合正则表达式Hibernate Validator提供的校验注解@NotBlank(message =)非 null,且长度必须大于 0@Email符合电子邮箱规范@Length(min=,max=)字符串长度在给定范围内@NotEmpty字符串或集合 非空@Range(min=,max=,message=)数字或字符串表示的数字在指定范围内

自定义

当业务需要一些官方没有提供的校验类型的话,为了方便,我们就需要考虑使用自定义注解的形式了。
这里,我们采用手机号的形式来演示一下,首先我们自定义一个注解:

@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Documented@Constraint(validatedBy = {PhoneValidation.class})public @interface PhoneValidationAnnotation {    String message() default "手机号不符合规范格式";}

在代码中,我们定义了默认的错误提示信息。
然后,我们写一个实现类,来具体实现注解所要表达的含义:

public class PhoneValidation implements ConstraintValidator {    String phonePattern;    Pattern compile;    @Override    public void initialize(PhoneValidationAnnotation constraintAnnotation) {        phonePattern = "1[3456789]d{9}";        compile = Pattern.compile(phonePattern);    }    @Override    public boolean isValid(String value, ConstraintValidatorContext context) {        return compile.matcher(value).matches();    }}

在代码中,我们创建了一个类,实现 ConstraintValidator 接口,并重写其的初始化方法和验证方法,这样,在验证参数的时候,其就会自动调用相关的方法来验证传递的是否正确。

// 注解:要校验的数字在给定的集合中// 定义接口@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Documented@Constraint(validatedBy = {EnumValidation.class})public @interface EnumValidationAnnotation {    long[] limitValue() default {};}// 具体实现public class EnumValidation implements ConstraintValidator {    private long[] longValues;    @Override    public void initialize(EnumValidationAnnotation constraintAnnotation) {        longValues = constraintAnnotation.limitValue();    }    @Override    public boolean isValid(Long value, ConstraintValidatorContext context) {        for (long longValue : longValues) {            if (value == longValue) {                return true;            }        }        return false;    }}

自定义依赖注解无效_SpringValidation用注解代替代码参数校验解析相关推荐

  1. 自定义依赖注解无效_最详细的自定义Spring Boot Starter开发教程

    1.前言 随着Spring的日渐臃肿,为了简化配置.开箱即用.快速集成,Spring Boot 横空出世.目前已经成为 Java 目前最火热的框架了.平常我们用Spring Boot开发web应用.S ...

  2. 自定义依赖注解无效_关于Apt注解实践与总结【包含20篇博客】

    超详细!安卓巴士开发者大会嘉宾及主题介绍 目录介绍 00.注解系列博客汇总 01.什么是apt 02.annotationProcessor和apt区别 03.项目目录结构 04.该案例作用 05.使 ...

  3. @valid注解_springboot使用自定义注解对接口参数校验

    目的: 对自定义注解有更好的认识,让参数校验变得更加简洁.灵活.方便. 正文: 首先,在pom文件引入hibernate的校验依赖 1.自定注解:(注意要加@Constraint约束) @Target ...

  4. springboot+aop+自定义注解,打造通用的全局异常处理和参数校验切面(通用版)...

    一.引入相应的maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifa ...

  5. 解决IDEA使用lombok注解无效,@Data不生效问题

    解决IDEA使用lombok注解无效,@Data不生效问题 参考文章: (1)解决IDEA使用lombok注解无效,@Data不生效问题 (2)https://www.cnblogs.com/houz ...

  6. Swagger 2——@ApiOperation注解、@ApiModel注解、@ApiImplicitParams注解、@ApiImplicitParam注解无效解决方案

    问题描述 Spring MVC REST API使用springfox-swagger2.swagger一切都可以正常工作,但是我的问题是我无法在我的swagger文档中添加其他信息. @RestCo ...

  7. java自定义注解实现前后台参数校验

    其实是可以通过@Constraint来限定自定义注解的方法. @Constraint(validatedBy = xxxx.class) 下面是我做的 java自定义注解实现前后台参数校验 的代码示例 ...

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

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

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

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

最新文章

  1. 详解图像直方图均衡化原理,附MATLAB、C、C++源码
  2. redis 基本类型和命令(一)
  3. 手机和邮箱的正则表达式
  4. 一些奇葩的元素节点object,video
  5. 扫描路径_npj: 纳米团簇表面的自动扫描—吸附位点和扩散路径
  6. *【POJ - 3659】Cell Phone Network (树形dp,最小支配集)
  7. 编程语言难度排名_编程语言TOP10!该如何选择适合自己的?
  8. js中toFixed方法的两个坑
  9. nodejs从服务器返回静态文件,nodejs静态资源服务器
  10. 彻底弄明白之数据结构中的排序七大算法-java实现
  11. 网站死链查询-在线网站死链查询提交工具免费
  12. 直系同源基因分析(orthofinder方法)
  13. Scrum板与Kanban如何抉择?prwnfivgd板与按照pgvhzd
  14. java 邮箱 电话号码 格式效验 后端
  15. 调用百度智能云OCR接口识别身份证和户口本
  16. Artifact “xxx - xxxx“:war exploded:部署工件时出错。请参阅服务器日志了解详细信息
  17. 如何用Jupyter中文集成版画一个图表
  18. linux加载的驱动无法卸载,Linux驱动模块卸载后不能再加载、驱动不能卸载的问题(转)...
  19. Mac安装brew及使用
  20. [Java] Comparator接口/compare方法的介绍与使用

热门文章

  1. python 中arange函数_浅谈Python中range与Numpy中arange的比较
  2. 片源系统服务器,OUO NAS10主控界面评测
  3. Win11任务栏如何设置在顶部
  4. QQ浏览器如何更改截图路径
  5. 深入理解static关键字
  6. POST请求转换为其他请求失效 input type=“hidden“ name=“_method“ value=“put“无效
  7. 中科院C语言应聘机试编程题6,中科院计算所保研笔试+机试+面试经验分享
  8. 如何从一张图片里取出其中一部分_如何鉴别坑人的锌合金龙头
  9. mysql怎么加固_mysql安装及加固
  10. 每个计算机系的学生都学离散数学,离散数学一阶逻辑精要.ppt