2011-07-15 1 views
0

Я придерживаюсь проверки в моем текущем прецеденте. Мое приложение имеет стандартную структуру (WEB < -> EJB3 Services < -> EJB3 DAO < -> DB). У меня есть объект, к которому применяются аннотации для проверки.Как объединить комплексную проверку бизнеса с JSR-303?

@Entity 
class PhoneNumber { 

    ... 

    private NumberType numberType; 
} 

где

enum NumberType { 
    FIXED, 
    MOBILE, 
    ANY 
} 

Теперь у меня есть новое правило проверки должны быть применены. При обновлении PhoneNumber не должно быть возможности изменить NumberType на ANY, если он был установлен ранее для FIXED или MOBILE.

Мои правила проверки бланов проверяются непосредственно перед операциями db, а правило выше должно применяться на уровне обслуживания (по крайней мере, я так думаю), чтобы иметь доступ к БД для получения предыдущей версии сущности для сравнения. Но, если фаза еще не проверена, я вынужден проверить ее вручную, если, например, numberType не равно нулю.

Не могли бы вы предоставить мне некоторые советы или общие правила, как справляться с более сложными проверками бизнеса (не только проверять значения одного поля в изоляции) при использовании проверки бинов?

ответ

0

Here вы можете найти хорошее описание того, как написать пользовательский валидатор, который может выполнять проверку «кросс-поля».

+0

Спасибо, но это не подходит для моей проблемы. Мне не нужна проверка поля. Мне нужно проверить одно поле против его предыдущего значения (хранящегося в БД). – grafthez

+0

Таким образом, вам придется запрашивать сущность из базы данных в вашем настраиваемом валидаторе и проверять ее значения. Но я не думаю, что это хорошая практика. Вместо этого я бы загрузил старый объект в бизнес-логику и проверил его значения здесь. Таким образом, вы не скрываете эту логику в валидаторе. – Kai

3

Я не думаю, что проверка бина - это правильное решение для реализации такой бизнес-логики.

Вместо этого вы можете осуществить эту проверку в методе setNumberType() объекта PhoneNumber. Там у вас есть старое значение под рукой и по сравнению с реализацией на уровне сервиса нет возможности выполнить незаконный переход состояния путем обхода (случайно или намеренно) службы, реализующей проверку.

+1

Я согласен с вашим первым абзацем. Но я бы не поставил чек в сущность. По моему мнению, классы сущностей - это просто немые POJO и не должны содержать бизнес-логику. В противном случае вы не можете сунуть бизнес-логику, потому что в любом сеттере могут быть сделаны некоторые неявные изменения. Это также затрудняет реорганизацию и трудно контролировать пример использования, если логика настолько распространена. – Kai