Skip to content

Nested validator do not use passed ConstraintGroup #24

Closed
@matejko219

Description

Hi. When I invoke validate with ConstraintGroup it seems that it is not passed to nested validator. Nested object validation works but it do not support mentioned feature.

public class GroupTest {
    
    private Validator<MainObject> mainObjectValidator;

    class MainObject {
        Long id;
        NestedObject nested;

        public Long getId() {
            return id;
        }

        public void setId(Long id) {
            this.id = id;
        }

        public NestedObject getNested() {
            return nested;
        }

        public void setNested(NestedObject nested) {
            this.nested = nested;
        }
    }

    class NestedObject {
        Long id;
        String text;

        public Long getId() {
            return id;
        }

        public void setId(Long id) {
            this.id = id;
        }

        public String getText() {
            return text;
        }

        public void setText(String text) {
            this.text = text;
        }
    }

    @BeforeEach
    void setUp() {

        Validator<NestedObject> nestedObjectValidator = ValidatorBuilder.<NestedObject>of()
                .constraintOnCondition(ValidationGroups.CREATE.toCondition(), b -> b.constraint(NestedObject::getId, "id", Constraint::isNull))
                .constraintOnCondition(ValidationGroups.UPDATE.toCondition(), b -> b.constraint(NestedObject::getId, "id", Constraint::notNull))
                .constraint(NestedObject::getText, "text", CharSequenceConstraint::notBlank)
                .build();

        mainObjectValidator = ValidatorBuilder.<MainObject>of()
                .constraintOnCondition(ValidationGroups.CREATE.toCondition(), b -> b.constraint(MainObject::getId, "id", Constraint::isNull))
                .constraintOnCondition(ValidationGroups.UPDATE.toCondition(), b -> b.constraint(MainObject::getId, "id", Constraint::notNull))
                .nest(MainObject::getNested, "nested", nestedObjectValidator)
                .build();
    }

    @Test
    void shouldBeValid() {
        var target = new MainObject();
        target.setId(1L);

        var nested = new NestedObject();
        nested.setId(1L);
        nested.setText("test");
        target.setNested(nested);

        var result = mainObjectValidator.validate(target, ValidationGroups.UPDATE);

        assertTrue(result.isValid());
    }

    @Test
    void shouldBeInvalid() {
        var target = new MainObject();
        target.setId(1L);

        var nested = new NestedObject();
        nested.setId(1L);
        target.setNested(nested);

        var result = mainObjectValidator.validate(target, ValidationGroups.CREATE);

        assertFalse(result.isValid());
        /*below assert fails because after validation there is only 2 errors (id in MainObject and lack    
        of text in NestedObject)*/
        assertEquals(3, result.size());
    }

}

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions