【问题标题】:Hibernate Validations ordering休眠验证排序
【发布时间】:2021-03-04 03:22:38
【问题描述】:

我正在使用休眠验证。 如果我们将几个组传递给 validate() 验证消息的顺序是随机的。如果两个验证应用于一个字段并且都失败并且这两个验证属于两个不同的组。 有什么方法可以保持验证的顺序吗?

// Bean
public class Register {

    @Size(min = 8, max = 50, message = "Minimum should be 5 and maximum should be 10", groups=Second.class)
    public String username;

    @Size(min = 8, max = 50, message = "Minimum should be 5 and maximum should be 10", groups=Second.class)
    @Pattern(regexp = "(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]*", message = "incorrect format", groups=First.class)
    public String password;
}


// Validate call
Set<ConstraintViolation<T>> constraintViolations = validator.validate(o, First.class, Second.class);

输入是

用户名“test”,密码“test”

然后所有验证都失败,但对于密码,验证消息的顺序是随机的。我希望 First 组的验证消息总是首先出现。

【问题讨论】:

  • 这能回答你的问题吗? Control validation annotations order?
  • @Code_Mode 不,如果我将使用 GroupSequence,那么验证将逐步进行。像第一个一样,如果没有失败,它只会检查第一组,然后检查第二组,这是向导方法。我想一次验证所有内容。
  • 听起来您想使用验证组来控制给定字段的消息的显示顺序(例如,对于您的密码字段,模式消息总是首先列出,然后尺寸信息)。这不是验证组的设计目的 - 您可能已经看到 groups 值在每个 ConstraintViolation 对象中不可用。我认为你最好的选择是一个糟糕的选择:运行validator.validate() 两次。一次用于First.class,再次用于Second.class。现在您有了控制显示顺序所需的信息。

标签: java hibernate validation


【解决方案1】:

默认:没有特定的验证顺序

hibernate-validator 文档状态在5.3. Defining group sequences

默认情况下,无论它们属于哪个组,没有特定顺序评估约束。但是,在某些情况下,控制评估约束的顺序很有用。

还有:

为了实现这样的验证顺序,您只需要定义一个接口并用@GroupSequence注释它,定义必须验证组的顺序(参见示例 5.7,“定义一个组序列”)。

定义组序列

按照给定的Example 5.7, “Defining a group sequence”,您将通过定义一个额外的接口来达到所需的顺序:

import jakarta.validation.GroupSequence;
import jakarta.validation.groups.Default;
// assume these validation-groups imported from your namespace
import your.validation.groups.First;
import your.validation.groups.Second;

@GroupSequence({ Default.class, First.class, Second.class })
public interface OrderedChecks {
}

使用组序列

文档展示了如何使用 Example 5.8, “Using a group sequence” 中的新序列,以适应您的情况。

// pass your Registration object along with the sequence class
validator.validate( registration, OrderedChecks.class );

⚠️ 这个解决方案只是理论上的,未经测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 2012-11-19
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多