首页 > 编程语言 >javax.validation分组校验

javax.validation分组校验

时间:2024-05-31 13:54:57浏览次数:13  
标签:Default 校验 默认 javax 分组 AddGroup validation class

    /*
        没有加分组groups的属于Default默认分组。
        添加分组groups的属于自定义分组,不属于默认分组。
        validation校验默认使用默认分组校验,不会校验自定义分组。
        因此如果需要校验自定义分组的字段,需要校验的时候加上自定义分组,如:
        ValidationUtil.validate(userEntity, Default.class, Group.AddGroup.class);
        或者在controller方法体加上@RequestBody @Validated({Default.class, Group.AddGroup.class}) UserEntity userEntity, BindingResult bindingResult
     */
在用户注册的时候或者登录的时候,我需要用户名和密码都进行非空校验。但是我在对用户进行分组的时候,我有一个分组实体,里面有分组名称和List<UserEntity>。
那么我在保存的时候,我会保存一个group和user的关系表,里面存分组id和userName。
这时候我在保存关系的时候,我只需要对用户名进行非空校验,而不需要对密码进行非空校验。这时候该怎么办呢?再定义一个user实体password不加注解校验?或者单独程序校验而不用注解校验?
其实javax.validation已经为我们考虑好了,不用那么麻烦。只需要对要校验的字段进行分组即可。
javax.validation分组校验:
注意:
没有加分组groups的属于Default默认分组。
添加分组groups的属于自定义分组,不属于默认分组。
validation校验默认使用默认分组校验,不会校验自定义分组。
因此如果需要校验自定义分组的字段,需要校验的时候加上分组,如:
ValidationUtil.validate(userEntity, Default.class, Group.AddGroup.class);
或者在controller方法入参加上@RequestBody @Validated({Default.class, Group.AddGroup.class}) UserEntity userEntity, BindingResult bindingResult
不想要校验某个分组的字段,把某个分组给去掉就好了。
package com.springbootvalidation.common;

/**
 * 验证分组
 */
public class Group {
    public interface AddGroup{}
}
package com.springbootvalidation.utils;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.xml.bind.ValidationException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
* @description: 校验工具类
*/
public class ValidationUtil {
    private static Validator validator;

    static {
       ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
       validator = vf.getValidator();
    }
    /**
      * javax.validation注解校验
      * @throws ValidationException
      * @throws ValidationException
      * @Description: 校验方法
      * @param t 将要校验的对象
      * @throws ValidationException
      * void
      * @throws
     */
    public static <T> List<String> validate(T t){
        return validate(t,null);
    }

    public static <T> List<String> validate(T t, Class<?>... groups){
        Set<ConstraintViolation<T>> set;
        if(groups != null && groups.length > 0){
            set = validator.validate(t,groups);
        }else{
            set = validator.validate(t);
        }
        List<String> validateError = new ArrayList<>();
        if(set.size()>0){
            for(ConstraintViolation<T> val : set){
                validateError.add(val.getMessage());
            }
        }
        return validateError;
    }
}

 javax.validation默认是Default默认分组。上面@Validated({Default.class})表示默认分组,也可以只用@Validated或者@Valid表示,去掉({Default.class}),这样效果等同于@Validated({Default.class})表示只是用默认分组校验。

默认分组校验不会校验AddGroup分组的字段。即不会校验userName字段不能为空。

这样的话如果其他地方用到此实体,而不想要校验userName,那么只用默认分组校验就可以了。因为默认分组校验只会校验默认分组的字段(即不加任何分组的字段),不会校验自定义分组的字段(如:加了groups = Group.AddGroup.class)。

总结:

那些不管在哪儿使用都要校验的字段,我们用默认分组(不加任何分组)即可。如果有些字段在这里需要校验,而在其他地方不需要校验,那么把这些字段加上分组即可,

如果要校验自定义分组的字段,只需要在校验的时候加上Group.AddGroup.class即可。

只校验默认分组的字段:只需要Default.class。

只校验自定义分组的字段:只需要Group.AddGroup.class。

需要校验默认分组又需要校验自定义分组的字段:加上Default.class,Group.AddGroup.class。

分组的作用就是区分有些字段我需要校验,而有些字段我不需要校验,那么我校验的时候选择要校验的分组即可,不校验的字段的分组不选择。

校验字段的方式有两种:

方式1:在controller的方法入参中加上@Validated({Default.class, Group.AddGroup.class})和BindingResult bindingResult。

方式2:用ValidationUtil工具类校验,ValidationUtil工具类的校验使得校验不局限在controller的方法入参中。想在任何时候,任何地方校验,就在哪里添加工具类的校验。

1.只想要校验Default默认分组(不加任何分组的字段,@NotBlank(message = "密码不能为空!")):

 2.只想要校验AddGroup的字段(@NotBlank(message = "用户名不能为空!",groups = Group.AddGroup.class),带groups的):

3.既想要校验默认分组字段又想要校验自定义分组字段,那么把要校验的字段的分组都加上:

标签:Default,校验,默认,javax,分组,AddGroup,validation,class
From: https://www.cnblogs.com/liftsail/p/18224396

相关文章

  • 自己实现dubbo参数校验(类似RestFul 参数校验)
    1.场景:因为工作中经常需要做参数校验,在springboot项目中使用@Valid+@NotNull、@NotBlank…注解开发API接口非常丝滑,相反在开发RPC接口时却还是需要编写大量的参数判断,严重影响主业务流程的开发(公司目前用的是Dubbo2.7.2)且代码整洁度、风格都受到了挑战。基于以上原因萌生了写一......
  • dubbo~javax.validation和jakarta.validation的介绍与排雷
    javax.validation和jakarta.validation都是用于Java中进行数据验证(validation)的相关API,它们提供了一套标准的验证框架,用于验证Java对象的属性是否符合指定的约束条件。这两个API的作用类似,只是在JavaEE平台的演进过程中发生了一些变化。javax.validation:javax.validation是最......
  • ts拯救前端:优雅的在运行时校验后端接口返回数据类型 typescript-json-schema+ ajv
    包管理器:pnpm环境:node依赖:typescript-json-schema、ajv准备工作1、安装依赖pnpmaddtypescript-json-schemapnpmaddajv2、准备需要校验的数据类型//userType.tsexportinterfaceUser{id:string;token:string;nick?:string;}3、使用typescrip......
  • 网关登录校验
    自定义过滤器网关过滤器有两种,分别是:GatewayFilter:路由过滤器,作用于任意指定的路由;默认不生效,要配置到路由后生效。GlobalFilter:全局过滤器,作用范围是所有路由;声明后自动生效。用自定义的GlobalFilter来完成登录校验提前准备的工具:AuthProperties:配置登......
  • Jakarta Bean Validation 规范介绍及其API使用以及与Spring Validator之间的关系
    JakartaBeanValidation规范1.BeanValidation的前世今生BeanValidation规范最早在OracleJavaEE下维护。2017年11月,Oracle将JavaEE移交给Eclipse基金会。2018年3月5日,Eclipse基金会宣布JavaEE(EnterpriseEdition)被更名为JakartaEE。随着JSR-303......
  • 创建一个配置为信任所有HTTPS连接的RestTemplate实例,不验证服务器的SSL证书。这个示
    这个配置类使用背景:可参考博客:springboot使用restTemplate发送https请求忽略ssl证书https://jsonll.blog.csdn.net/article/details/129191580?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-1......
  • 后端数据校验之Validator的使用方法
    https://blog.csdn.net/m0_72167535/article/details/1281733261.使用场景2.常用注解3.非空校验注解@NotNull、@NotEmpty、@NotBlank的区别和运用4.使用示例1.使用场景方法体在根据参数进行逻辑处理时,尝尝需要对参数进行校验,一些简单的校验可以使用Validator校验方法。2.常......
  • Nodejs 在实战中的校验用户信息(JWT、localStorage、Cookie)
    本文分别站在了客户端(reactjs)与服务端(nodejs)的角度,总结了整个用户校验过程各自的操作。一概念明晰1.1localStorage和Cookie都是存储数据的方式localStorage:储存在客户端(浏览器)本地Cookie:存储在服务端,安全性更高。(是一个HTTP请求标头,由服务器通过 Set-Cookie 设置,......
  • SpringValidation
    一、概述:​JSR303中提出了BeanValidation,表示JavaBean的校验,HibernateValidation是其具体实现,并对其进行了一些扩展,添加了一些实用的自定义校验注解。​Spring中集成了这些内容,你可以在Spring中以原生的手段来使用校验功能,当然Spring也对其进行了一点简单的扩展,以便其更适......
  • Java基于saas模式云MES制造执行系统源码Spring Boot + Hibernate Validation什么是MES
    Java基于saas模式云MES制造执行系统源码SpringBoot+HibernateValidation什么是MES系统?MES制造执行系统,通过互联网技术实现从订单下达到产品完成的整个生产过程进行优化管理。能有效地对生产现场的流程进行智能控制,防错防呆防漏,自动化集成各种制造信息,使管理者准确掌控工......