Bean校验

1、不吹不擂,第一篇就能提升你对Bean Validation数据校验的认知

validation-api提供了bean校验的规范,hibernate-validator提供了它的实现,在不依赖web环境的情况下,需要导入EL的api的依赖(web环境下,已经提供了该el-api的实现)。并且从2.0.1开始,javax.validation正式改名为jakarta.validation。

简单示例

导入依赖

 <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>5.4.3.Final</version>
  </dependency>

  <!-- 规范API -->
  <dependency>
      <groupId>javax.el</groupId>
      <artifactId>javax.el-api</artifactId>
      <version>3.0.0</version>
  </dependency>

  <dependency>
      <groupId>org.glassfish</groupId>
      <artifactId>javax.el</artifactId>
      <version>3.0.0</version>
  </dependency>
@ToString
@Setter
@Getter
public class Person {

    @NotNull
    public String name;
    @NotNull
    @Min(0)
    public Integer age;
}
import com.zzhua.entity.Person;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.Set;
public class Test01 {
    public static void main(String[] args) {
        Person person = new Person();
        person.setAge(-1);

        // 1、使用【默认配置】得到一个校验工厂  这个配置可以来自于provider、SPI提供
        ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
        // 2、得到一个校验器(Validator等校验器是线程安全的,因此一般来说一个应用全局仅需一份即可,因此只需要初始化一次)
        Validator validator = validatorFactory.getValidator();
        // 3、校验Java Bean(解析注解) 返回校验结果
        Set<ConstraintViolation<Person>> result = validator.validate(person);

        // 输出校验结果
        result.stream().map(v -> v.getPropertyPath() + " " + v.getMessage() + ": " + v.getInvalidValue()).forEach(System.out::println);
    }
    /* 输出:
        age 最小不能小于0: -1
		name 不能为null: null
	*/

}

2、站在使用层面,Bean Validation这些标准接口你需要烂熟于胸\

抽取公用的方法如下

public abstract class ValidatorUtil {

    public static ValidatorFactory obtainValidatorFactory() {
        return Validation.buildDefaultValidatorFactory();
    }
    
    public static Validator obtainValidator() {
        return obtainValidatorFactory().getValidator();
    }

    public static ExecutableValidator obtainExecutableValidator() {
        return obtainValidator().forExecutables();
    }

    public static <T> void printViolations(Set<ConstraintViolation<T>> violations) {
        violations.stream().map(v -> v.getPropertyPath() + " " + v.getMessage() + ": " + v.getInvalidValue()).forEach(System.out::println);
    }

}

validate:校验Java Bean

验证Java Bean对象上的所有约束

<T> Set<ConstraintViolation<T>> validate(T object, Class<?>... groups);
@ScriptAssert(script = "_this.name==_this.fullName", lang = "javascript")
@Data
public class User {

    @NotNull
    private String name;
    
    @Length(min = 20)
    @NotNull
    private String fullName;
}

@Test
public void test5() {
    User user = new User();
    user.setName("YourBatman");

    Set<ConstraintViolation<User>> result = ValidatorUtil.obtainValidator().validate(user);
    ValidatorUtil.printViolations(result);
}

validateProperty:校验指定属性

校验某个Java Bean中的某个属性上的所有约束。

<T> Set<ConstraintViolation<T>> validateProperty(T object, String propertyName, Class<?>... groups);
@Test
public void test6() {
    User user = new User();
    user.setFullName("YourBatman");

    Set<ConstraintViolation<User>> result = ValidatorUtil.obtainValidator().validateProperty(user, "fullName");
    ValidatorUtil.printViolations(result);
}

validateValue:校验value值

验某个value值,是否符合指定属性上的所有约束。可理解为:若我把这个value值赋值给这个属性,是否合法?

<T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType,
										  	String propertyName,
										  	Object value,
										  	Class<?>... groups);

@Test
public void test7() {
    Set<ConstraintViolation<User>> result = ValidatorUtil.obtainValidator().validateValue(User.class, "fullName", "A哥");
    ValidatorUtil.printViolations(result);
}

获取Validator实例

方式一:工厂直接获取

@Test
public void test3() {
    Validator validator = ValidatorUtil.obtainValidatorFactory().getValidator();
}

方式二:从上下文获取

@Test
public void test3() {
    Validator validator = ValidatorUtil.obtainValidatorFactory().usingContext()
            .parameterNameProvider(new DefaultParameterNameProvider())
            .clockProvider(DefaultClockProvider.INSTANCE)
            .getValidator();
}

3、Jakarta Bean Validation官方文档(英文)

Jakarta Bean Validation官方文档(英文) or https://beanvalidation.org/

4、springmvc参数校验原理

https://blog.csdn.net/shenchaohao12321/article/details/100163991

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值