Reputation: 23
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
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