RAKESH YEDLAPPALLI
RAKESH YEDLAPPALLI

Reputation: 23

How to validate multiple fields of a class in Spring Boot

I have class SizingInformation in which there are 4 objects available Ex: Sizing1, Sizing2 , Sizing3 as well as List list, I want to write a Spring boot validator which returns true or false based on the below conditions

Condition 1: ((Sizing1!=null && Sizing2!=null && Sizing3!=null) || List().isNotEmpty()) return true

Brief explanation:

When Sizing1!=null && Sizing2!=null && Sizing3!=null then it should return true OR if the list is not empty return true other than all conditions should return false.

CODE

@NotNull(message = "Sizing 1 must not be empty")
private String sizing1;

@NotNull(message = "Sizing 2 must not be empty")
private String sizing2;

@NotNull(message = "Sizing 3 must not be empty")
private String sizing3;



@NotNull(message = "List Shouldn't be empty")
private List<Sizing> listOfSizing;

Upvotes: 0

Views: 659

Answers (1)

times29
times29

Reputation: 3373

You will need a class based validator. I created a sample project for you with some tests that you can follow:

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;

import javax.validation.*;
import java.lang.annotation.*;
import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;

class Scratch {

    public static void main(String[] args) {
        final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();

        assertThat(validator.validate(new SizingInformation("a", "b", "c", null))).isEmpty();
        assertThat(validator.validate(new SizingInformation(null, null, null, List.of(new Sizing())))).isEmpty();


        assertThat(validator.validate(new SizingInformation("a", "b", null, null))).isNotEmpty();
        assertThat(validator.validate(new SizingInformation(null, null, null, null))).isNotEmpty();
        assertThat(validator.validate(new SizingInformation(null, null, null, List.of()))).isNotEmpty();
        assertThat(validator.validate(new SizingInformation("a", "b", "c", List.of(new Sizing())))).isNotEmpty();
    }

    @ValidSizingInformation
    public static class SizingInformation {

        private final String sizing1;

        private final String sizing2;

        private final String sizing3;

        private final List<Sizing> listOfSizing;

        public SizingInformation(String sizing1, String sizing2, String sizing3, List<Sizing> listOfSizing) {
            this.sizing1 = sizing1;
            this.sizing2 = sizing2;
            this.sizing3 = sizing3;
            this.listOfSizing = listOfSizing;
        }

        public String getSizing1() {
            return sizing1;
        }

        public String getSizing2() {
            return sizing2;
        }

        public String getSizing3() {
            return sizing3;
        }

        public List<Sizing> getListOfSizing() {
            return listOfSizing;
        }
    }

    public static class Sizing {

    }

    @Documented
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = ValidSizingInformation.Validator.class)
    public @interface ValidSizingInformation {

        String message() default "Invalid sizings";

        Class<?>[] groups() default {};

        Class<? extends Payload>[] payload() default {};

        class Validator implements ConstraintValidator<ValidSizingInformation, SizingInformation> {

            @Override
            public void initialize(ValidSizingInformation annotation) { }

            @Override
            public boolean isValid(SizingInformation sizings, ConstraintValidatorContext context) {
                final boolean individualSizingsGiven =
                        StringUtils.isNotBlank(sizings.getSizing1()) &&
                                StringUtils.isNotBlank(sizings.getSizing2()) &&
                                StringUtils.isNotBlank(sizings.getSizing3());
                final boolean sizingListGiven = CollectionUtils.isNotEmpty(sizings.getListOfSizing());
                return individualSizingsGiven ^ sizingListGiven;
            }

        }

    }

}

Note that I use Apache Commons for null-safe checks of the String and List.

Upvotes: 1

Related Questions