Я не могу найти способ ограничить проверку конкретной аннотацией без изменения проверенного класса. Вы можете ограничить его свойством, вызвав Validator##validateProperty(object, propertyName, ...)
, но для того, чтобы явно ограничить его набором аннотаций, необходимо назначить группы аннотациям :
.
- Создайте интерфейс для каждой группы аннотаций, которые вы хотите проверить.
- Укажите этот интерфейс для
groups
свойства каждой аннотации для проверки с этой группой. Если аннотация также должна проверяться по умолчанию, либо добавьте интерфейс Default
. - Добавьте интерфейс к вызовам валидатора.
Пример:
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.validation.groups.Default;
public class SomeTest {
public static void main(String[] args) {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Cat a = new Cat(null);
// invalid: name is null
output(validator.validate(a), a);
Cat b = new Cat("?");
// invalid: name too short
output(validator.validate(b), b);
// valid: only @NotNull is evaluated, @Size does not matter.
output(validator.validate(b, NotNullName.class), b);
// invalid: only @NotNull is evaluated, @Size does not matter. Name is null.
output(validator.validate(a, NotNullName.class), a);
}
/**
* Output validation result.
*
* @param validate
* the validate
*/
private static void output(Set<ConstraintViolation<Cat>> validationResult, Cat cat) {
if (validationResult.isEmpty()) {
System.out.println(cat + " is valid!");
} else {
System.out.println(cat + " is invalid!\n" + validationResult);
}
}
// no need to implement an interface - just name it for annotation groups attribute:
public static class Cat {
@NotNull(groups = { NotNullName.class, Default.class })
@Size(min = 3, max = 45)
private String name;
public Cat(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("Cat [");
if (name != null) {
builder.append("name=");
builder.append(name);
}
builder.append("]");
return builder.toString();
}
}
public static interface NotNullName {
// no members needed here
}
}
Вывод:
Cat [] is invalid!
[ConstraintViolationImpl{interpolatedMessage='darf nicht null sein', propertyPath=name, rootBeanClass=class SomeTest$Cat, messageTemplate='{javax.validation.constraints.NotNull.message}'}, ConstraintViolationImpl{interpolatedMessage='darf nicht null sein', propertyPath=name, rootBeanClass=class SomeTest$Cat, messageTemplate='{javax.validation.constraints.NotNull.message}'}]
Cat [name=?] is invalid!
[ConstraintViolationImpl{interpolatedMessage='Länge muss zwischen 3 und 45 liegen', propertyPath=name, rootBeanClass=class SomeTest$Cat, messageTemplate='{javax.validation.constraints.Size.message}'}]
Cat [name=?] is valid!
Cat [] is invalid!
[ConstraintViolationImpl{interpolatedMessage='darf nicht null sein', propertyPath=name, rootBeanClass=class SomeTest$Cat, messageTemplate='{javax.validation.constraints.NotNull.message}'}]