I am using Hibernate Validator with Spring to validate object when inserting it into repository with CrudRepository::save. Let's say we have class:
public class Person {
public int id;
@NotBlank(message="User with id: ${id} is missing name")
public String name;
}
I want the interpolated message to access all fields of the Person instance e.g. id field and then access them like "${id}" or "${this.id}". Documentation mentions something about being able to access all bean properties but I guess it can only be used with class-level constraints.
Is there some way to do this without resorting to using class-level constraints?
A constraint validator cannot access any info outside the field itself. So, in other words, there's no way to access sibling fields. This is related to the scope of a constraint. Look at it this way:
A not blank
namecan be a field in person, or it can be a field in the company, or some other class. It makes no difference to@NotBlankwhere it is located.Hence as you've suggested in your question, to get access to other class fields when interpolating the message the constraint should be at a class level... To not create a lot of custom constraints, you might consider looking at a
@ScriptAssert.Also note that
ConstraintViolationExceptioncontains a list ofConstraintViolationin it and from it you should be able to get access to a leaf bean (getLeafBean()) or to root bean (getRootBean()), and get the info you need after the exception was thrown.