Я большой поклонник JSR 303 BV, но в моем текущем проекте у меня много «контекстно-зависимой проверки», и я не нахожу разумного подхода к их реализации с помощью BV. В основном правила проверки могут зависеть от
- авторизованный пользователь (он хранится в http-запросе)
- пользователь, с которым мы действуем - идентификатор пользователя является параметром пути URL-адреса REST, например /foo/bar/user/1/sth
- Оба эти
Небольшой пример:
class Alphabet{
@Valid
private Alpha a;
@Valid
private Beta b;
@Valid
private Gamma g;
}
И правило проверки: если пользователь, чей идентификатор будет указан в URL-адресе, имеет роль «admin», ни одно из свойств «a», «b», «g» не может быть нулевым. Если у него есть роль «пользователь», только «а» не должно быть нулевым, а другие реквизиты должны быть нулевыми.
Таким образом, в основном такого рода правила могут быть легко реализованы как ограничение уровня класса класса Alphabet, но пользовательскому валидатору потребуется каким-то образом получить доступ к идентификатору пользователя, который указан в URL-адресе. Есть ли какой-либо разумный способ добиться этого, или мне нужно заставить всех клиентов REST передавать идентификатор пользователя несколько раз: в URL-адресе и в полезной нагрузке, поэтому последний будет использоваться только BV. Более сложный случай, когда правило проверки зависит от вошедшего в систему пользователя, поэтому пользовательские валидаторы должны будут каким-то образом получить доступ к аутентифицированному принципалу - из ThreadLocal или HttpServletRequest.