Метод | Описание |
---|---|
String getMessage() | Возвращает интерполированное сообщение об ошибке для данного нарушения |
String getMessageTemplate() | Возвращает неинтерполированное сообщение об ошибке |
T getRootBean() | Возвращает корневой компонент, участвующий в валидации |
Class | Возвращает класс корневого компонента, участвующего в валидации |
Object getLeafBean() | Возвращает дочерний компонент, к которому применяется ограничение |
Path getPropertyPath() | Возвращает путь свойств к значению от корневого компонента |
Object getInvalidValue() | Возвращает значение, которое не соответствует заданному ограничению |
ConstraintDescriptor > getConstraintDescriptor() | Возвращает метаданные об ограничении |
Первый этап валидации компонента — приобрести экземпляр интерфейса Validator. Как и в большинстве спецификаций Java EE, вы можете либо получить Validator программно (если ваш код выполняется вне контейнера), либо внедрить его (если код выполняется в EJB- или веб-контейнере).
Если вы делаете это программно, то необходимо начать с класса Validation, осуществляющего начальную загрузку поставщика валидации компонентов. Его метод buildDefaultValidatorFactory строит и возвращает фабрику ValidatorFactory, которая, в свою очередь, используется для построения Validator. Код выглядит следующим образом:
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Затем вам придется управлять жизненным циклом ValidatorFactory и программно закрывать его:
factory.close();
Если ваше приложение работает в контейнере Java EE, то контейнер должен предоставлять через JNDI следующие экземпляры:
• ValidatorFactory под java: comp/ValidatorFactory;
• Validator под java: comp/Validator.
Затем вы можете искать эти JNDI-имена и получать экземпляры Validator. Но вместо поиска экземпляров через JNDI вы можете запросить, чтобы они были внедрены с помощью аннотации @Resource:
@Resource ValidatorFactory validatorFactory;
@Resource Validator validator;
Если ваш контейнер использует CDI (а это происходит в Java EE 7 по умолчанию), то он должен допускать внедрение с помощью @Inject:
@Inject ValidatorFactory;
@Inject Validator;
В любом случае (как с @Resource, так и с @Inject) контейнер следит за жизненным циклом фабрики. Поэтому вам не придется вручную создавать или закрывать ValidatorFactory.
Валидация компонентов
Как только вы получите Validator программно или путем внедрения, можете использовать его методы как для валидации целого компонента, так и для работы с отдельно взятым свойством. В листинге 3.21 показан класс CD, в котором действуют ограничения, связанные со свойствами, параметрами методов и возвращаемым значением.
public class CD {
··@NotNull @Size(min = 4, max = 50)
··private String title;
··@NotNull
··private Float price;
··@NotNull(groups = PrintingCatalog.class)
··@Size(min = 100, max = 5000, groups = PrintingCatalog.class)
··private String description;
··@Pattern(regexp = "[A-Z][a-z]{1,}")
··private String musicCompany;
··@Max(value = 5)
··private Integer numberOfCDs;
··private Float totalDuration;
··@NotNull @DecimalMin("5.8")
··public Float calculatePrice(@DecimalMin("1.4") Float rate) {
····return price * rate;
··}
··@DecimalMin("9.99")
··public Float calculateVAT() {
····return price * 0.196f;
··}
}