Spring MVC: Trgger manual validation of a form object
Sometimes it may be needed to use manual validation in Spring MVC @Controller. This is very simple with Spring’s org.springframework.validation.ValidationUtils class. Learn how to invoke a validator in two different scenarios.
Scenario 1 - invoke validation
In this scenario, I have a user form with username field. Username field is validated with custom validator in order to verify the existance in e.g. database.
public class User {
@UserExists
private String username;
}
In controller class I have a method that handles POST method of that object:
@Autowired
private org.springframework.validation.Validator validator;
@RequestMapping(value = "/user", method = RequestMethod.POST)
public String validate(@ModelAttribute User user, Errors errors) {
ValidationUtils.invokeValidator(validator, user, errors);
if (errors.hasErrors()) {
// error, show errors to the user
}
// success, form is valid!
}
org.springframework.validation.ValidationUtils
is a class for invoking a org.springframework.validation.Validator
.
Please note that user parameter is followed by org.springframework.validation.Errors
object. Spring initializes this object but it is empty and can be be passed to a invokeValidator
method.
Scenario 2 - invoke validation with hints
In this scenario, user form gets a bit more complicated:
@GroupSequence(value = {ValidationOrder.First.class, ValidationOrder.Second.class})
interface ValidationOrder {
interface First {}
interface Second {}
}
public class User {
@UserExists(groups = ValidationOrder.First.class)
@UserIsEntitledToDiscount(groups = ValidationOrder.Second.class)
private String username;
}
Thanks to @GroupSequence
I could decide about the order of validation. To trigger validation I need to pass an additional argument to invokeValidator
method so the groups are correctly used:
ValidationUtils.invokeValidator(validator, user, errors, ValidationOrder.class);
Source code
The source code contains all three approaches, so that you can quickly compare them: https://github.com/kolorobot/spring-mvc-beanvalidation11-demo
Similar articles
In case you find this article interesting, have a look at my other blog posts:
- Validation Groups in Spring MVC
- Different ways of validating @RequestBody in Spring MVC with @Valid annotation
- Better Error Messages with Bean Validation 1.1
- Spring MVC Integration Testing: Assert the given model attribute(s) have global errors
- Spring 4.1 and Java 8: java.util.Optional as a @RequestParam, @RequestHeader and @MatrixVariable in Spring MVC