Hibernate.orgCommunity Documentation
The Bean Validation specification provides not only a validation engine, but also a metadata repository for all defined constraints. The following paragraphs are discussing this API. All the introduced classes can be found in the javax.validation.metadata package.
The entry into the metadata API is via
Validator.getConstraintsForClass
which returns an instance of
the BeanDescriptor
interface. Using this bean descriptor you can determine whether the
specified class hosts any constraints at all via
beanDescriptor.isBeanConstrained
.
If a constraint declaration hosted by the requested class is
invalid, a ValidationException
is
thrown.
You can then call
beanDescriptor.getConstraintDescriptors
to get a set of
ConstraintDescriptor
s representing all class level
constraints.
If you are interested in property level constraints, you can call
beanDescriptor.getConstraintsForProperty
or
beanDescriptor.getConstrainedProperties
to get a single resp.
set of PropertyDescriptor
s (see Section 6.2, “PropertyDescriptor”).
The PropertyDescriptor
interface extends the ElementDescriptor
interface
and represents constraints on properties of a class. The constraint can be
declared on the attribute itself or on the getter of the attribute -
provided Java Bean naming conventions are respected. A
PropertyDescriptor
adds isCascaded
(returning true
if the property is marked with
@Valid
) and getPropertyName
to the
ElementDescriptor
functionality.
The ElementDiscriptor
interface is the common base class for
BeanDescriptor
and
PropertyDescriptor
. Next to the
hasConstraints
and getConstraintDescriptors
methods it also offers access to the
ConstraintFinder
API which allows you to query the
metadata API in a more fine grained way. For example you can restrict your
search to constraints described on fields or on getters or a given set of
groups. Given an ElementDescriptor
instance you
just call findConstraints
to retrieve a
ConstraintFinder
instance.
Example 6.1. Usage of ConstraintFinder
Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); BeanDescriptor beanDescriptor = validator.getConstraintsForClass(Person.class); PropertyDescriptor propertyDescriptor = beanDescriptor.getConstraintsForProperty("name"); Set<ConstraintDescriptor<?>> constraints = propertyDescriptor.findConstraints() .declaredOn(ElementType.METHOD) .unorderedAndMatchingGroups(Default.class) .lookingAt(Scope.LOCAL_ELEMENT) .getConstraintDescriptors();
Example 6.1, “Usage of ConstraintFinder” shows an example on how
to use the ConstraintFinder
API. Interesting are
especially the restrictions unorderedAndMatchingGroups
and
lookingAt(Scope.LOCAL_ELEMENT)
.
The former allows to only return
ConstraintDescriptors
matching a specified set of
groups wheras the latter allows to distinguish between constraint directly
specified on the element (Scope.LOCAL_ELEMENT
) or
constraints belonging to the element but hosted anywhere in the class
hierarchy (Scope.HIERARCHY
).
Order is not respected by unorderedAndMatchingGroups, but group inheritance and inheritance via sequence are.
Last but not least, the ConstraintDescriptor
interface describes a single constraint together with its composing
constraints. Via an instance of this interface you get access to the
constraint annotation and its parameters, as well as the groups the
constraint is supposed to be applied on. It also also you to access the
pass-through constraint payload (see Example 3.2, “Defining CheckCase constraint annotation”).
Copyright © 2009 - 2011 Red Hat, Inc. & Gunnar Morling