springboot使用Validator参数校验

引用:https://www.cnblogs.com/yang-yz/p/17576507.html

Validator校验框架遵循了 jsr-303验证规范(参数校验规范)
JSR : java specification requests

为了解决开发人员在校验参数方面,少写代码

依赖:

xml 复制代码
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

可以校验json传递,,表单传递,,只传递一个属性也可以

java 复制代码
@RestController
@Validated
public class ValidController {




    @GetMapping("/test")
    public void test03(@Email String email){
        System.out.println("email");
    }




    @GetMapping("/range")
    public void test05(@Range.List({@Range(min = 1,max = 10),@Range(min = 2,max = 8)}) Integer range){
        System.out.println("range = " + range);
    }

    @GetMapping("/sex")
    public void test06(@EnumString(value = {"male","female"},message = "性别不详") String sex){
        System.out.println("sex = " + sex);
    }

        @PostMapping("/update")
    public void test04(@RequestBody @Validated(value = ValidGroup.Crud.Create.class) ValidVo validVo){
            System.out.println("validVo = " + validVo);
        }
}

可以自定义校验: 按照自己的校验规则校验

分组校验: 根据不同的组去校验,,,一个VO对象,,在更新和新增的时候,,传递参数的校验规格是不同的,,更新的时候需要携带id,,新增不需要,,可以去创建两个不同的VO,,,也可以使用分组校验,,在更新的时候使用更新的分组,,,,创建的时候使用创建的分组

定义分组标识:

java 复制代码
public interface ValidGroup extends Default {

    interface Crud extends ValidGroup{
        interface Create extends Crud{}
        interface Update extends Crud{}
        interface Query extends Crud{}
        interface Delete extends Crud{}
    }
}

在使用注解的时候,,将分组带进去,,

java 复制代码
@Data
public class ValidVo {
    @NotNull(groups = {ValidGroup.Crud.Update.class},message = "更新不能为空")
    @Null(groups = {ValidGroup.Crud.Create.class},message = "创建id必须为空")
    private String id;



    @Range
    private Integer age;
}

在校验的时候,,标明是哪一个分组:


使用代码校验
java 复制代码
    public static void main(String[] args) {
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();

        ValidVo validVo = new ValidVo();
        validVo.setId("1");
        validVo.setAge(3);

        Set<ConstraintViolation<ValidVo>> validate = validator.validate(validVo, ValidGroup.Crud.Update.class);
        System.out.println("validate = " + validate);

        Set<ConstraintViolation<ValidVo>> validate1 = validator.validate(validVo, ValidGroup.Crud.Create.class);
        System.out.println("validate1 = " + validate1);
    }
全局处理参数异常

javax.validation.ConstraintViolationExceptionorg.springframework.validation.BindExceptionorg.springframework.web.bind.MethodArgumentNotValidException

自定义参数校验

定义一个注解,,一个实现ConstraintValidator的类

java 复制代码
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.METHOD,ElementType.PARAMETER})
@Constraint(validatedBy = EnumStringValidator.class)
public @interface EnumString {

    String message() default "value is not in enum";

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

    // 枚举的所有中文值
    String[] value();

    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.FIELD,ElementType.METHOD,ElementType.PARAMETER})
    @interface List{
        EnumString[] value();
    }

}
java 复制代码
public class EnumStringValidator implements ConstraintValidator<EnumString,String> {
    private List<String> enumStringList;

    @Override
    public void initialize(EnumString constraintAnnotation) {
        String[] value = constraintAnnotation.value();
        this.enumStringList = Arrays.asList(value);
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {

        if(value == null){
            return true;
        }

        boolean contains = enumStringList.contains(value);
        return contains;
    }
}
相关推荐
用户3856803349964 分钟前
appium从入门到精通php,移动端自动化测试Appium 从入门到项目实战Python版
后端
瑶山17 分钟前
社区版Idea怎么创建Spring Boot项目?Selected Java version 17 is not supported. 问题解决
java·spring boot·intellij-idea·创建项目
学习编程的Kitty29 分钟前
JavaEE初阶——多线程(1)初识线程与创建线程
java·开发语言·java-ee
陈小桔31 分钟前
SpringBoot之配置文件
spring boot
天天摸鱼的java工程师35 分钟前
SpringCloud + Nacos + Feign + Resilience4j:微服务间调用的熔断降级与重试策略
后端
智能化咨询1 小时前
基于Spring Boot + Vue 3的乡村振兴综合服务平台性能优化与扩展实践
vue.js·spring boot·性能优化
长安城没有风1 小时前
从入门到精通【Redis】初识Redis哨兵机制(Sentinel)
java·数据库·redis·后端
蒂法就是我1 小时前
java集合类的底层类是哪个
java·开发语言
canonical_entropy1 小时前
范式重构:可逆计算如何颠覆DDD的经典模式
后端·低代码·领域驱动设计
绝无仅有1 小时前
某大厂跳动Java面试真题之问题与解答总结(五)
后端·面试·github