JSR 303 validation with validation groups
March 06, 2012 12:24:53 Last update: March 06, 2012 12:24:53
Validation groups can be used to control which rules validation rules to run. A validation group can be identified by any Java interface (not class!). Multiple validation groups may be specified when validating.
In this example, I added a validation group named
and added a
Now validate
Test with "
In this example, I added a validation group named
MyValidationGroup (src/main/java/com/example/MyValidationGroup.java in Maven project):
package com.example; public interface MyValidationGroup { }
and added a
@Size rule for a person's name, because my database can only store up to 15 characters for a person's name:
package com.example; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; import javax.validation.constraints.Size; public class Person { @NotNull @Pattern(regexp="\\w.*") @Size(min=3, max=15, groups=MyValidationGroup.class) private String name; public Person(String name) { this.name = name; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } }
Now validate
Person with a JUnit test (src/test/java/com/example/TestPersonWithGroup.java in Maven project):
package com.example; import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; public class TestPersonWithGroup { private Validator validator; @Before public void setUp() { ValidatorFactory f = Validation.buildDefaultValidatorFactory(); validator = f.getValidator(); } @Test public void testNameNull() { // @NotNull not applicable to MyValidationGroup, no violations here Person p = new Person(null); Set<ConstraintViolation<Person>> violations = validator.validate(p, MyValidationGroup.class); assertEquals(0, violations.size()); } @Test public void testNameLength() { // name length not enough - fail validation Person p = new Person("x"); Set<ConstraintViolation<Person>> violations = validator.validate(p, MyValidationGroup.class); assertEquals(1, violations.size()); // name length enough - pass validation Person p2 = new Person("xyz"); violations = validator.validate(p2, MyValidationGroup.class); assertEquals(0, violations.size()); } @Test public void dummyTest() { // java.lang.Serializable may also be used as a test group // though nothing to do here Person p = new Person(null); Set<ConstraintViolation<Person>> violations = validator.validate(p, java.io.Serializable.class); assertEquals(0, violations.size()); } }
Test with "
mvn clean test". The rules where groups is not specified, which belong to the javax.validation.groups.Default group, are not executed with these tests.