08-02-2023, 04:02 PM
To add to the above by @laffuste with Lombok, in Spring Boot 2.7, I have a MyDtoList validator that delegates back down to the singular validator for a plural argument. In my Spring RestController that has singular and plural arguments:
In application yaml:
spring:
jackson:
deserialization:
accept-single-value-as-array: true
In my controller:
@InitBinder("myDto")
public void addMyDtoValidator(WebDataBinder binder) {
binder.addValidators(myDtoValidator);
}
@InitBinder("myDtoList")
public void addMyDtoListValidator(WebDataBinder binder) {
binder.addValidators(myDtoListValidator);
}
Then the validator code:
private MyDtoValidator singleDtoValidator;
public MyDtoListValidator(MyDtoValidator singleDtoValidator) {
this.singleDtoValidator = singleDtoValidator;
}
@Override
public boolean supports(Class<?> clazz) {
return ValidList.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
if (target == null) {
errors.rejectValue(null, "should not be null error");
} else {
ValidList<MyDto> list = (ValidList<MyDto>) target;
for (MyDtodto: list) {
singleDtoValidator.validate(dto, errors);
}
}
}
In application yaml:
spring:
jackson:
deserialization:
accept-single-value-as-array: true
In my controller:
@InitBinder("myDto")
public void addMyDtoValidator(WebDataBinder binder) {
binder.addValidators(myDtoValidator);
}
@InitBinder("myDtoList")
public void addMyDtoListValidator(WebDataBinder binder) {
binder.addValidators(myDtoListValidator);
}
Then the validator code:
private MyDtoValidator singleDtoValidator;
public MyDtoListValidator(MyDtoValidator singleDtoValidator) {
this.singleDtoValidator = singleDtoValidator;
}
@Override
public boolean supports(Class<?> clazz) {
return ValidList.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
if (target == null) {
errors.rejectValue(null, "should not be null error");
} else {
ValidList<MyDto> list = (ValidList<MyDto>) target;
for (MyDtodto: list) {
singleDtoValidator.validate(dto, errors);
}
}
}