MFIhsan
MFIhsan

Reputation: 1057

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;
        }
    }
}

Upvotes: 3

Views: 1038

Answers (2)

Makoton
Makoton

Reputation: 453

Só you can create your own validation. Example :

@RequiredParam
@RegexpValidation("^[\\p{IsLatin}]{2}[\\p{IsLatin}-]* [\\p{IsLatin}]{2}[\\p{IsLatin}- ]*$")
private String name;

Create a class validator e send the form that you want to validate:

Map<String, String> invalidFieldMap = Validator.validate(form);

    if (invalidFieldMap.size() > 0)
    { 
    LOGGER.warn("Invalid parameters");
    }

Look this gist Validator.java https://gist.github.com/cmsandiga/cb7ab4d537ef4d4691f7

Upvotes: 0

Misha
Misha

Reputation: 929

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.
}

Upvotes: 3

Related Questions