深入了解数据校验:Java Bean Validation 2.0(JSR380) (4)

对于若你想使用xml文件独立配置校验规则,可以使用Configuration.addMapping(new FileInputStream(validationFile));,现在很少这么使用,略~
使用注意事项:ValidatorFactory被创建后应该缓存起来再提供使用,因为它是县城安全的。

因为现在都会使用Hibernate-Validation来处理校验,因此此处只关心方式三~

HibernateValidatorConfiguration

此接口表示配置,继承自标注接口javax.validation.Configuration。很明显,它是HibernateValidator的专属配置类

先看顶级接口:javax.validation.Configuration,为构建ValidatorFactory的配置类。默认情况下,它会读取配置文件META-INF/validation.xml,Configuration提供的API方法是覆盖xml配置文件项的。若没有找到validation.xml,就会使用默认的ValidationProviderResolver也就是:DefaultValidationProviderResolver。

public interface Configuration<T extends Configuration<T>> { // 该方法调用后就不会再去找META-INF/validation.xml了 T ignoreXmlConfiguration(); // 消息内插器 它是个狠角色,关于它的使用场景,后续会有详解(包括Spring都实现了它来做事) // 它的作用是:插入给定的约束冲突消息 T messageInterpolator(MessageInterpolator interpolator); // 确定bean验证提供程序是否可以访问属性的协定。对每个正在验证或级联的属性调用此约定。(Spring木有实现它) // 对每个正在验证或级联的属性都会调用此约定 // Traversable: 可移动的 T traversableResolver(TraversableResolver resolver); // 创建ConstraintValidator的工厂 // ConstraintValidator:定义逻辑以验证给定对象类型T的给定约束A。(A是个注解类型) T constraintValidatorFactory(ConstraintValidatorFactory constraintValidatorFactory); // ParameterNameProvider:提供Constructor/Method的方法名们 T parameterNameProvider(ParameterNameProvider parameterNameProvider); // java.time.Clock 用作判定@Future和@Past(默认取值当前时间) // 若你希望他是个逻辑实现,提供一个它即可 // @since 2.0 T clockProvider(ClockProvider clockProvider); // 值提取器。这是add哦~ 负责从Optional、List等这种容器里提取值~ // @since 2.0 T addValueExtractor(ValueExtractor<?> extractor); // 加载xml文件 T addMapping(InputStream stream); // 添加特定的属性给Provider用的。此属性等效于XML配置属性。 // 此方法通常是框架自己分析xml文件得到属性值然后放进去,调用者一般不使用(当然也可以用) T addProperty(String name, String value); // 下面都是get方法喽 MessageInterpolator getDefaultMessageInterpolator(); TraversableResolver getDefaultTraversableResolver(); ConstraintValidatorFactory getDefaultConstraintValidatorFactory(); ParameterNameProvider getDefaultParameterNameProvider(); ClockProvider getDefaultClockProvider(); BootstrapConfiguration getBootstrapConfiguration(); // 整个配置也可返回出去 // 上面都是工作,这个方法才是最终需要调用的:得到一个ValidatorFactory ValidatorFactory buildValidatorFactory(); }

该接口提供了一些标准的配置项。在实际应用中都是使用Hibernate Validation,所以再看看这个具体的子接口:

public interface HibernateValidatorConfiguration extends Configuration<HibernateValidatorConfiguration> { // 这批属性,证明直接可以通过System属性值来控制,大大地方便~ // 这个机制快速失败机制:true检查完一个有错误就返回,false全部检查完把错误消息一起返回 默认false String FAIL_FAST = "hibernate.validator.fail_fast"; String ALLOW_PARAMETER_CONSTRAINT_OVERRIDE = "hibernate.validator.allow_parameter_constraint_override"; String ALLOW_MULTIPLE_CASCADED_VALIDATION_ON_RESULT = "hibernate.validator.allow_multiple_cascaded_validation_on_result"; String ALLOW_PARALLEL_METHODS_DEFINE_PARAMETER_CONSTRAINTS = "hibernate.validator.allow_parallel_method_parameter_constraint"; // @since 5.2 @Deprecated String CONSTRAINT_MAPPING_CONTRIBUTOR = "hibernate.validator.constraint_mapping_contributor"; // @since 5.3 String CONSTRAINT_MAPPING_CONTRIBUTORS = "hibernate.validator.constraint_mapping_contributors"; // @since 6.0.3 String ENABLE_TRAVERSABLE_RESOLVER_RESULT_CACHE = "hibernate.validator.enable_traversable_resolver_result_cache"; // @since 6.0.3 ScriptEvaluatorFactory:执行脚本 @Incubating String SCRIPT_EVALUATOR_FACTORY_CLASSNAME = "hibernate.validator.script_evaluator_factory"; // @since 6.0.5 comparing date/time in temporal constraints. In milliseconds. @Incubating String TEMPORAL_VALIDATION_TOLERANCE = "hibernate.validator.temporal_validation_tolerance"; // ResourceBundleMessageInterpolator用于 load resource bundles ResourceBundleLocator getDefaultResourceBundleLocator(); // 创建一个ConstraintMapping:通过编程API配置的约束映射 // 设置映射后,必须通过addMapping(constraintmapping)将其添加到此配置中。 ConstraintMapping createConstraintMapping(); // 拿到所有的值提取器 @since 6.0 @Incubating Set<ValueExtractor<?>> getDefaultValueExtractors(); // 往下就开始配置了~~~~~~~~~~ HibernateValidatorConfiguration addMapping(ConstraintMapping mapping); HibernateValidatorConfiguration failFast(boolean failFast); // used for loading user-provided resources: HibernateValidatorConfiguration externalClassLoader(ClassLoader externalClassLoader); // true:表示允许覆盖约束的方法。false表示不予许(抛出异常) 默认值是false HibernateValidatorConfiguration allowOverridingMethodAlterParameterConstraint(boolean allow); // 定义是否允许对返回值标记多个约束以进行级联验证。 默认是false HibernateValidatorConfiguration allowMultipleCascadedValidationOnReturnValues(boolean allow); // 定义约束的**并行方法**是否应引发ConstraintDefinitionException HibernateValidatorConfiguration allowParallelMethodsDefineParameterConstraints(boolean allow); // 是否允许缓存TraversableResolver 默认值是true HibernateValidatorConfiguration enableTraversableResolverResultCache(boolean enabled); // 设置一个脚本执行器 @Incubating HibernateValidatorConfiguration scriptEvaluatorFactory(ScriptEvaluatorFactory scriptEvaluatorFactory); // 允许在时间约束中比较日期/时间时设置可接受的误差范围 // 比如@Past @PastOrPresent @Future @FutureOrPresent @Incubating HibernateValidatorConfiguration temporalValidationTolerance(Duration temporalValidationTolerance); // 允许设置将传递给约束验证器的有效负载。如果多次调用该方法,则只传播最后传递的有效负载。 @Incubating HibernateValidatorConfiguration constraintValidatorPayload(Object constraintValidatorPayload); }

关于此接口的唯一实现类:ConfigurationImpl,这里就不用再做分析了,因为对于Validation这块,咱们面向接口编程是完全没有问题的~

准备好了Configuration后,下一步显然就是configuration.buildValidatorFactory()来得到一个ValidatorFactory喽,关于ValidatorFactory这块的内容,请听下文分解~

总结

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdfwf.html