当前位置: 首页 > 知识库问答 >
问题:

JSR303-应用按顺序定义的所有验证组

孙永思
2023-03-14

我有一个想对其进行条件验证的bean。为此,我定义了一个DefaultGroupSequenceProvider

现在,当验证序列中多个组中违反约束的对象时,只有第一个失败的组返回其结果。我希望在所有违规行为上都得到一个错误,而不仅仅是第一组失败的违规行为。

我认为这不需要代码示例,但如果我错了,我很乐意提供一个。

我跟踪了这个http://kh-yiu.blogspot.com/2014/04/conditional-bean-validation-using.html创建序列时。如果有必要,我们使用Spring。

请注意,这是可行的,因为不可能将无效的bean报告为有效的。但是,如果用户有一些输入打破了3个约束,而我返回了2个失败,那么在第一个字段得到纠正后,用户将在最后一个字段上再次遇到失败。不太方便用户使用。

示例:

@GroupSequenceProvider(BeanSequenceProvider.class)
public class MyBean {
    @NotEmpty
    private String name;

    @NotNull
    private MyType type;

    @NotEmpty(groups = Special.class)
    private String lastName;

    // Getters and setters        
}

枚举类型

public enum MyType {
    FIRST, SECOND
}

提供者

public class BeanSequenceProvider implements DefaultGroupSequenceProvider<MyBean> {
    @Override
    public List<Class<?>> getValidationGroups(final MyBean object) {
        final List<Class<?>> classes = new ArrayList<>();

        classes.add(MyBean.class);

        if (object != null && object.getType() == MyType.SECOND) {
            classes.add(Special.class);
        }

        return classes;
    }

组注释

public interface Special {
}

测试类别

public class MyBeanTest {

    private static Validator validator;

    private MyBean objectUnderTest;

    @BeforeClass
    public static void setUpOnce() throws Exception {
        final ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();

        validator = validatorFactory.getValidator();
    }

    @Before
    public void setUp() throws Exception {
        objectUnderTest = new MyBean();

        objectUnderTest.setName("Simen");
        objectUnderTest.setType(MyType.FIRST);
        objectUnderTest.setLastName("Woop");
    }

    @Test
    public void testValid() throws Exception {
        assertThat(validator.validate(objectUnderTest), is(empty()));
    }

    @Test
    public void testMissingName() throws Exception {
        objectUnderTest.setName(null);

        assertThat(validator.validate(objectUnderTest), hasSize(1));
    }

    @Test
    public void testMissingLastName() throws Exception {
        objectUnderTest.setLastName(null);

        assertThat(validator.validate(objectUnderTest), is(empty()));

        objectUnderTest.setType(MyType.SECOND);

        assertThat(validator.validate(objectUnderTest), hasSize(1));

        objectUnderTest.setName(null);

        assertThat(validator.validate(objectUnderTest), hasSize(2));
    }

最后一个断言失败了,因为有一个违规,而不是两个。由于在默认组中违反了约束,因此不会违反特殊组。


共有1个答案

范稳
2023-03-14

好了,现在我明白你的问题了。答案是,如果给定组中存在一个或多个冲突,验证将停止。引用规范:

处理组的定义见第4.6节“验证例程”;如果序列中处理的其中一个组生成一个或多个约束冲突,则不得处理序列中后面的组。这可确保仅当另一组约束有效时,才计算一组约束。

看见http://beanvalidation.org/1.1/spec/#constraintdeclarationvalidationprocess-groupsequence组序列

在您的情况下,“默认”组中存在冲突,这意味着“特殊”组永远不会被验证。

 类似资料:
  • 问题内容: 我正在使用Spring MVC创建一个网站,并且为了持久性,我将Spring Data JPA与Hibernate 4用作我的JPA提供程序。目前正在使用Hibernate Validator处理验证。我有一个问题,我的验证程序被两次调用,我不知道为什么。这是一个问题的主要原因是因为第二轮未将依赖项自动关联到验证器中,并且出现了空指针异常。以下是导致失败的调用顺序: 提交注册表,然后首

  • null 有人能解释为什么要调用验证器两次,特别是为什么要跳过“userrepository.save(user);”回到这些验证器里? 多谢 下面是我的user.java类 我的用户存储库: 最后,我的persistence-context.xml文件

  • 我正在使用spring(4.2.0.RELEASE)、hibernate validator(5.2.1.Final)和validation api(1.1.0.Final)对后端应用程序进行JSR验证,配置如下:, 但是没有一个JSR303注释在我的应用程序中工作。 注意:在POJO类上添加了JSR303注释,在服务类(使用POJO)上添加了@Validated注释,还尝试在方法级别添加@Val

  • 问题内容: 有没有一种方法可以验证在Mockito中是否曾经调用过a? 问题答案: 帮助您做到这一点。

  • 问题内容: 我有这样的自定义订购需求: 我曾经想过用3个不同的选择查询的帮助下结合和。但是,我不能这样做,因为必须 在 和 之前 使用。 如何进行选择(或多个选择)以实现上面的自定义排序? 另一个解决方法可能会有所帮助,就是使此选择查询中返回的 第一条记录 成为最后一条记录,但是如何? 问题答案: 试试这个: 1亿个常量必须大于N。 这是一个简单的演示

  • JSR303Bean验证包含一些现成的约束,但也允许定义自定义约束。 我有一种感觉,对于许多没有随JSR实现一起提供的项目来说,有很多共同的约束。 日期范围 密码复杂性检查 等于交叉字段验证(堆栈溢出投票最高的'bean验证'问题) ... 所以我的问题是:是否有一个(值得信赖的)库包含commons jsr 303(Bean验证)约束?