JSR 303 validation with validation groups 

Joined:
08/13/2009
Posts:
164

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 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.
Share |
| Comment  | Tags