Search code examples
springbean-validationspring-annotations

Spring custom validation annotation + Validator implementation


I have a simple POJO which is considered valid if one of the 2 attributes (ssn / clientId) is populated. I have written a custom Spring Validator to do the validation.

The question I have is, is there a way I can annotate my POJO so that my custom Validator is invoked for validation automatically? I'm trying to avoid manually invoking it from multiple places.

public class QueryCriteria {
    @NotNull
    private QueryBy queryBy;
    private String ssn;
    private String clientId;
}

public class QueryCriteriaValidator implements org.springframework.validation.Validator {
    @Override
    public boolean supports(Class<?> clazz) {
        return QueryCriteria.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        QueryCriteria criteria = (QueryCriteria) target;

        switch (criteria.getQueryBy()){
            case CLIENT:
                //validation logic
                break;

            case SSN:
                //validation logic
                break;

            default:
                break;
        }
    }
}

Solution

  • With Spring MVC, just add the custom validator to your controller's data binder:

    @Autowired
    private QueryCriteriaValidator validator;
    
    @InitBinder
    public void initializeBinder(WebDataBinder binder) {
        binder.addValidators(validator);
    }
    

    Otherwise, you'll want to inject the custom validator and call it yourself.

    @Autowired
    private QueryCriteriaValidator validator;
    
    public void process(QueryCriteria criteria) {
        check(validator.validate(criteria));
        // Continue processing.
    }