Issue
I have set of properties with typical Java validation annotations (Hibernate implementation), e.g.,
@Size(max = 10)
private String data;
I would like to know if programmatically the Size's max
value can be accessed.
This is needed to perform some transformative operation on data
when it's retrieved. Obviously, 10
can be hard coded to a final static class variable, but is there a way to access these annotation values?
Solution
Since the annotation has a runtime retention, you can access it through reflection. For instance (ignoring any exceptions):
Field field = MyClass.class.getDeclaredField("data");
Size size = field.getAnnotation(Field.class);
int max = size.max();
If you want to get the value that triggered a constraint error, catch the ConstraintViolationException
. You can then get the constraint annotation from the violation. Another example:
// just some code to get a descriptor
ConstraintDescriptor<?> descriptor = constraintViolationException.getAnnotations().stream()
.map(ConstraintViolation::getConstraintDescriptor)
.findAny()
.orElseThrow();
// now its properties can be accessed
Map<String, Object> attributes = descriptor.getAttributes();
// attributes contains an entry with key "max" and value 10 for your @Size annotation
Size size = (Size) descriptor.getAnnotation();
int max = size.max();
Answered By - Rob Spoor
Answer Checked By - Cary Denson (JavaFixing Admin)