gpt4 book ai didi

validation - 如何设置 JSR303 bean 验证的检查顺序

转载 作者:行者123 更新时间:2023-12-02 17:25:19 26 4
gpt4 key购买 nike

我使用 JSR303 Bean Validation 来检查表单输入。

@NotBlank
@Size(min = 4, max = 30)
private String name;

@NotBlank
@Size(max = 100)
@Email
private String mail;

当name = ''且email = ''时,@NotBlank, @Size at name, @NotBlank,将检查邮件中的@Size、@Email。

我想设置检查顺序,例如当上一个顺序无效时,下一个不检查。

@NotBlank(order = 1)
@Size(min = 4, max = 30, order = 2)
private String name;

(JSR303不支持以上内容)

有没有办法使用JSR303来实现它?(我认为自定义注释就可以完成,但我不喜欢为每个属性添加自定义注释)

我还考虑了验证组和组顺序,但我认为我的需要有一些差异。

@NotBlank(groups = First.class)
@Size(min = 4, max = 30, groups = Second.class)
private String name;

@NotBlank(groups = First.class)
@Size(max = 100, groups = Second.class)
@Email(groups = Third.class)
private String mail;

当名称为空且邮件为“abc”时。 JSR303只会检查@NotBlank at name和@NotBlank at mail,因为@NotBlank at name无效,所以第二组和第三组不被检查。

但我需要的是姓名中的@NotBlank,并且应该检查邮件中的@NotBlank、@Size、@Email。由于name处的@NotBlank无效,所以name处的@Size不被检查,而mail处的@NotBlank、@Size有效,所以mail处的@Email被检查。

也许,下面的伪代码可以清楚地描述我的要求。

// retrieves all fields and check one by one.
for (Field field : fields) {
List annotations = getJsr303Annotations(field);
// retrieves all annotations on field and check one by one.
for (Annotation annotation : annotations) {
CheckResult result = check(annotation, field);
if (result.isValid()) {
continue;
} else {
errors.add(result);
break;
}
}
}

有没有好的方法通过JSR303实现我的要求?

最佳答案

是的 Bean Validation 支持此功能。它称为验证组和组序列。组是简单的标记接口(interface),例如,您可以创建两个接口(interface) FirstSecond 并将代码更改为如下所示:

@NotBlank(groups = First.class)
@Size(min = 4, max = 30, groups = Second.class)
private String name;

然后你可以定义一个组序列:

@GroupSequence({ First.class, Second.class})
interface All {
}

获取验证器并调用 validator.validate(myObject, All.class)

一切都在文档中。

关于validation - 如何设置 JSR303 bean 验证的检查顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3827508/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com