Java Hibernate验证排序

Java Hibernate验证排序,java,hibernate,validation,Java,Hibernate,Validation,我正在使用Hibernate验证。 如果我们将几个组传递给validate(),则验证消息的顺序是随机的。如果两个验证应用于一个字段,但都失败,并且这两个验证属于两个不同的组。 有没有办法保持验证的顺序 // Bean public class Register { @Size(min = 8, max = 50, message = "Minimum should be 5 and maximum should be 10", groups=Second.clas

我正在使用Hibernate验证。 如果我们将几个组传递给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);
//Bean
公共班级登记册{
@大小(最小值=8,最大值=50,消息=“最小值应为5,最大值应为10”,组=第二级)
公共字符串用户名;
@大小(最小值=8,最大值=50,消息=“最小值应为5,最大值应为10”,组=第二级)
@模式(regexp=“(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]*”,message=“格式不正确”,groups=First.class)
公共字符串密码;
}
//验证呼叫
Set constraintViolations=validator.validate(o,First.class,Second.class);
输入是

用户名“测试”,密码“测试”

然后,所有验证都会失败,但对于密码,验证消息的顺序是随机的。我希望第一组的验证消息始终显示在第一位。

默认值:没有特定的验证顺序 hibernate验证程序文档状态为:

默认情况下,约束不会按特定顺序进行计算,无论它们属于哪个组。但是,在某些情况下,控制约束求值的顺序非常有用

此外:

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

定义组序列 通过定义一个额外的接口,您可以达到所需的顺序:

import jakarta.validation.GroupSequence;
导入jakarta.validation.groups.Default;
//假设这些验证组是从您的命名空间导入的
先导入您的.validation.groups.First;
导入您的.validation.groups.Second;
@GroupSequence({Default.class,First.class,Second.class})
公共接口有序检查{
}
使用组序列 文档显示了如何在中使用新序列,并根据您的情况进行了调整

//将注册对象与sequence类一起传递
validator.validate(注册,OrderedChecks.class);

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

这是否回答了您的问题@代码\模式否,如果我将使用GroupSequence,那么验证将一步一步地进行。与第一组一样,如果没有失败,它将只检查第一组,然后检查第二组,即向导方法。我想立即验证所有内容。听起来您想使用验证组来控制给定字段的消息显示顺序(例如,对于您的密码字段,模式消息总是列在第一位,在大小消息之前)。这不是设计验证组的目的-您可能已经看到,
值在每个
ConstraintViolation
对象中都不可用。我认为你最好的选择是一个糟糕的选择:运行两次
validator.validate()。一次用于
First.class
,另一次用于
Second.class
。现在您有了控制显示顺序所需的信息。