金歌 发表于 2024-8-18 11:52:40

validation好用的Java数据校验工具

1.概述

        Validation 是一种检查机制,用来验证数据的有效性和完整性。其目标是确保数据满足特定的条件或规则,从而防止无效或恶意数据进入系统。
2.使用

        环境:spring boot3
2.1 导入依赖

   <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
        <version>3.0.2</version>
</dependency>
2.2 添加注解

        首先要在controller上添加 @Validated 开启验证,然后如果是传入的参数验证可以直接在参数前加验证注解;
        如果是传入的对象,则必要在对象前加 @Validated,然后在实体类中某个必要验证的字段上添加验证注解;
@Validated
@Tag(name = "用户相关接口")
public class UserController {

    public Result updateUser(@RequestBody @Validated User user) {}

    public ResponseResult updateUserAvatar(@RequestParam @URL String avatar) {}
} public class User {
    @NotEmpty
    @Size(max = 10,min = 1)
    private String nickname;
    @Email
    private String email;
} 3.分组校验

         某个实体类如果参加多个方法的校验,就必要将校验条件分组
@Data
public class Category {

    @TableId(value = "id", type = IdType.AUTO)
    @NotNull(groups = Update.class)
    private Integer id;//主键ID

    @NotEmpty(groups = {Update.class,Add.class})
    private String categoryName;//分类名称

    @NotEmpty
    private String categoryAlias;//分类别名
   
    public interface Add extends Default {

    }
    public interface Update extends Default {

    }
}

[*]如果字段不指定分组 ,则归属于默认分组,必要该字段的分组必要继承Default
public Result add(@RequestBody @Validated(Category.Add.class) Category category){}

public Result update(@RequestBody @Validated(Category.Update.class) Category category){} 4.自定义验证注解

        有的时间提供的注解满足不了验证需求,我们可以自己自定义注解
        举例:
import com.luobei.validation.StateValication;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.*;

/**
* @author : luobei
* @date : 2024/5/17 15:58
*/
@Documented                                       //在生成文档时包含这个注解
@Constraint(validatedBy = {StateValication.class})//指定提供校验规则的类
@Target({ElementType.FIELD})                        //定义注解的应用目标,这里注解针对类的属性
@Retention(RetentionPolicy.RUNTIME)               //注解会在运行时可用
public @interface State {
    //校验失败的后的信息
    String message() default "state参数的值只能是已发布或者草稿";
    //指定分组
    Class<?>[] groups() default {};
    //负载
    Class<? extends Payload>[] payload() default {};
}         定义验证规则:
import com.luobei.annotation.State;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;

/**
* @author : luobei
* @date : 2024/5/17 16:48
* @return: 返回false校验不通过,反之亦然
*/
public class StateValication implements ConstraintValidator<State,String> {

    @Override
    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
      //提供校验规则
      if(value == null){
            return false;
      }
      if(value.equals("已发布")||value.equals("草稿")){
            return true;
      }
      return false;
    }
} 5.验证注解汇总

@URL:验证是否为有效的url
@Null:验证对象是否为 null
@NotNull:验证对象是否不为 null
@AssertTrue:验证 Boolean 字段的值是否为 true
@AssertFalse:验证 Boolean 字段的值是否为 false
@Min(value):验证数值是否大于即是指定的最小值
@Max(value):验证数值是否小于即是指定的最大值
@DecimalMin(value):验证数值是否大于即是指定的最小值(字符串形式的值)
@DecimalMax(value):验证数值是否小于即是指定的最大值(字符串形式的值)
@Size(min, max):验证元素的巨细是否在指定范围内(可以应用于字符串、聚集、数组等)
@Digits(integer, fraction):验证数值的整数位和小数位的位数
@Past:验证日期是否在过去
@PastOrPresent:验证日期是否在过去或如今
@Future:验证日期是否在将来
@FutureOrPresent:验证日期是否在将来或如今
@Pattern(regex):验证字符串是否符合指定的正则表达式
@Email:验证字符串是否是有效的电子邮件地址
@NotEmpty:验证字符串、聚集、地图或数组是否不为空(长度不为 0)
@NotBlank:验证字符串是否不为 null 且去除空格后的长度大于 0
@Positive:验证数值是否为正数
@PositiveOrZero:验证数值是否为正数或 0
@Negative:验证数值是否为负数
@NegativeOrZero:验证数值是否为负数或 0
@CreditCardNumber:验证字符串是否是有效的名誉卡号

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: validation好用的Java数据校验工具