我很高兴宣布 Hibernate Validator 5.3 的第一个版本发布!

5.3 版本的大致想法是原型化几个可能在未来 Bean Validation 2.0 规范中标准化的特性。例如,我们将致力于解决长期请求的 对单个属性上的约束进行排序 的解决方案。

如果您想看到在原型化工作中解决任何特定特性(最终可能包含在 BV 2.0 中),请与我们联系,并告知您在规范中缺少哪些最重要的功能。我们已经编制了一份 初步问题列表,我们正在考虑将其包含在 BV 2.0 中。当然,我们无法解决所有这些问题,所以如果您能告诉我们哪些对您最有帮助,将非常有帮助。

约束的动态有效载荷

为了启动,Alpha 1 允许您为自定义约束违规添加额外的上下文数据。检查约束违规的代码可以以比解析基于字符串的约束违规消息更安全的方式访问和解释这些数据。把它想象成现有 Bean Validation 有效载荷功能 的动态变体。

例如,假设我们有一个 @Matches 约束,确保一个长属性与给定的值匹配,并有一定的容差。

public static class Package {

    @Matches(value=1000, tolerance=100)
    public long weight;
}

如果被注解的值无效,则生成的约束违规应具有特定的 严重性,这取决于值是否在给定的容差范围内。然后,该严重性值可以用于在 UI 中特别格式化错误。

@Matches 约束的定义并非新特性,它只是一个常规的自定义约束注解。

@Retention(RUNTIME)
@Constraint(validatedBy = { MatchesValidator.class })
@Documented
public @interface Matches {

    public enum Severity { WARN, ERROR; }

    String message() default "Must match {value} with a tolerance of {tolerance}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};

    long value();
    long tolerance();
}

约束验证器是其中最有趣的部分

public class MatchesValidator implements ConstraintValidator<Matches, Long> {

    private long tolerance;
    private long value;

    @Override
    public void initialize(Matches constraintAnnotation) {
        this.value = constraintAnnotation.value();
        this.tolerance = constraintAnnotation.tolerance();
    }

    @Override
    public boolean isValid(Long value, ConstraintValidatorContext context) {
        if ( value == null ) {
            return true;
        }

        if ( this.value == value.longValue() ) {
            return true;
        }

        HibernateConstraintValidatorContext hibernateContext = context.unwrap(
                HibernateConstraintValidatorContext.class
        );
        hibernateContext.withDynamicPayload(
                Math.abs( this.value - value ) < tolerance ? Severity.WARN : Severity.ERROR
        );

        return false;
    }
}

isValid()方法中,通过HibernateConstraintValidatorContext#withDynamicPayload()设置严重性对象。注意,如果约束违反被发送到远程客户端,例如通过RMI,负载对象必须是可序列化的。

验证客户端可以像这样访问动态负载

HibernateConstraintViolation<?> violation = violations.iterator()
    .next()
    .unwrap( HibernateConstraintViolation.class );

if ( violation.getDynamicPayload( Severity.class ) == Severity.ERROR ) {
    // ...
}

还有其他什么?

Alpha 1版本的其他特性包括改进的OSGi支持(感谢Benson Margulies为此做出的贡献!)、可选的参数约束放松(感谢Chris Beckey!)、以及几个错误修复和改进,其中还包括在注解处理器中支持跨参数约束(感谢Nicola Ferraro!)。

您可以在变更日志中找到所有已解决的问题的完整列表。要使用Maven、Gradle等获取版本,请使用GAV坐标org.hibernate:{hibernate-validator|hibernate-validator-cdi|hibernate-validator-annotation-processor}:5.3.0.Alpha1。或者,提供了一个包含所有内容的分发包,可在SourceForge上找到(TAR.GZZIP)。

要联系,请使用以下渠道


返回顶部