Building Dynamic Spring Boot Validators
In modern Java applications, validation is more than just a formality; it’s a crucial part of maintaining data integrity and ensuring a seamless user experience. When working with Spring Boot, validation often starts with predefined constraints. ...

- Flexibility: They allow validation rules to be altered based on user inputs or external conditions.
- Reusability: These validators can be reused across different parts of the application with varying rules.
- Maintainability: Changes to validation rules can be made without modifying the core validation logic.
- Validation rules are not fixed and may vary based on user roles or configurations.
- Different entities require similar but slightly different validation logic.
- Business rules change frequently and need to be reflected immediately without code changes.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public interface DynamicValidator<T> extends ConstraintValidator<DynamicConstraint, T> {
void setValidationCriteria(String criteria);
}
import javax.validation.ConstraintValidatorContext;
public class KeywordValidator implements DynamicValidator<String> {
private String criteria;
@Override
public void initialize(DynamicConstraint constraintAnnotation) {
// No initialization needed
}
@Override
public void setValidationCriteria(String criteria) {
this.criteria = criteria;
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return value != null && value.contains(criteria);
}
}
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Constraint(validatedBy = KeywordValidator.class)
@Target({ ElementType.FIELD, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface DynamicConstraint {
String message() default "Invalid value";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
public class ValidatorConfig {
private Validator validator;
public ValidatorConfig() {
ValidatorFactory factory = new LocalValidatorFactoryBean();
this.validator = factory.getValidator();
}
public void validate(String value, String criteria) {
KeywordValidator keywordValidator = (KeywordValidator) validator.getConstraintsForClass(String.class)
.getConstraintValidators().iterator().next();
keywordValidator.setValidationCriteria(criteria);
boolean isValid = keywordValidator.isValid(value, null);
System.out.println("Validation result: " + isValid);
}
}
public class DynamicValidatorTest {
public static void main(String[] args) {
ValidatorConfig validatorConfig = new ValidatorConfig();
// Test with different criteria
validatorConfig.validate("Hello World", "World"); // Expected output: true
validatorConfig.validate("Hello World", "Java"); // Expected output: false
}
}
Read more at : Building Dynamic Spring Boot Validators
About the author
I am Tuanh.net. As of 2024, I have accumulated 8 years of experience in backend programming. I am delighted to connect and share my knowledge with everyone.
Comments
Join the discussionNo comments yet. Be the first to comment.





