Hibernate Validator - 验证嵌套的Property

时间:2012-05-10 06:22:56

标签: java bean-validation

我在下面的测试用例中有一个问题。为什么没有groups参数的嵌套属性的验证总是失败?如何在没有组的情况下实现嵌套属性的验证?

提前谢谢

亲切的问候

基督教

我的测试用例:

    package validation;
    import java.util.Set;
    import javax.validation.*;
    import javax.validation.constraints.*;
    import junit.framework.Assert;
    import lombok.Data;
    import lombok.extern.slf4j.Slf4j;
    import org.junit.*;

    @Slf4j
    public class NestedPropertiesTest {

        private ValidatorFactory factory;
        private Validator validator;

        @Before
        public void setUp() throws Exception {
            log.info("\n\nTest start:");
            this.factory = Validation.buildDefaultValidatorFactory();
            this.validator = factory.getValidator();
        }

        @Test
        public void testNestedBarNullValue() {
            Foo foo = new Foo();
            Bar bar = new Bar();
            bar.setNotempty(null);
            foo.setBar(bar);
            log.info("With groups:");
            Set<ConstraintViolation<Foo>> errors = validator.validateProperty(foo, "bar.notempty", Checks.class);
            logErrors(errors);
            Assert.assertFalse(errors.isEmpty());
            log.info("Without groups:");
            errors = validator.validateProperty(foo, "bar.notempty");
            logErrors(errors);
            Assert.assertFalse(errors.isEmpty());
        }

        @Test
        public void testNestedBarMinSize() {
            Foo foo = new Foo();
            Bar bar = new Bar();
            bar.setNotempty("1");
            foo.setBar(bar);
            log.info("With groups:");
            Set<ConstraintViolation<Foo>> errors = validator.validateProperty(foo, "bar.notempty", Checks.class);
            logErrors(errors);
            Assert.assertFalse(errors.isEmpty());
            log.info("Without groups:");
            errors = validator.validateProperty(foo, "bar.notempty");
            logErrors(errors);
            Assert.assertFalse(errors.isEmpty());
        }

        @SuppressWarnings("rawtypes")
        private void logErrors(Set errors) {
            log.info("Nr. of validation errors: {}", errors.size());
            for (Object error : errors) {
                ConstraintViolation cv = (ConstraintViolation) error;  
                log.info("{}: {}", cv.getPropertyPath(), cv.getMessage());
            }
        }

        @Data private class Foo {
            @Valid private Bar bar;
        }
        @Data private class Bar {
            @NotNull(groups=Checks.class)
            @Size(min = 2, groups=Checks.class)
            private String notempty;
        }
        private interface Checks {}
    }

我的pom(以防万一):

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>noorg</groupId>
        <artifactId>validation</artifactId>
        <version>0.0.1-SNAPSHOT</version>

        <dependencies>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-validator</artifactId>
                <version>4.2.0.Final</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.10</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>0.11.0</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-simple</artifactId>
                <version>1.6.4</version>
            </dependency>
        </dependencies>
    </project>

1 个答案:

答案 0 :(得分:5)

指定组后,您的约束不再隐式成为默认组的一部分。如果您希望注释仍然在默认组中,则需要指定它。

    @Data private class Bar {
        @NotNull(groups={Checks.class, javax.validation.groups.Default.class})
        @Size(min = 2, groups={Checks.class, javax.validation.groups.Default.class})
        private String notempty;
    }