Читаем Изучаем Java EE 7 полностью

Чтобы валидировать свойства целого компонента, мы просто должны создать экземпляр CD и вызвать метод Validator.validate(). Если экземпляр валиден, то возвращается пустое множество ConstraintViolation. В следующем коде показан валидный экземпляр CD (с заголовком и ценой), который и проверяется. После этого код удостоверяет, что множество ограничений действительно является пустым.

CD cd = new CD("Kind of Blue", 12.5f);

Set> violations = validator.validate(cd);

assertEquals(0, violations.size());

С другой стороны, следующий код вернет два объекта ConstraintViolation — один будет соответствовать заголовку, а другой — цене (оба они нарушают @NotNull):

CD cd = new CD();

Set> violations = validator.validate(cd);

assertEquals(2, violations.size());

Валидация свойств

В предыдущих примерах валидируются свойства целого компонента. Но существует метод Validator.validateProperty(), позволяющий проверять конкретное именованное свойство заданного объекта.

В показанном ниже коде создается CD — объект, имеющий нулевой заголовок и нулевую цену; соответственно, такой компонент невалиден. Но, поскольку мы проверяем только свойство numberOfCDs, валидация проходит успешно и мы получаем пустое множество нарушений ограничений:

CD cd = new CD();

cd.setNumberOfCDs(2);

Set> violations = validator.validateProperty(cd, "numberOfCDs");

assertEquals(0, violations.size());

С другой стороны, в следующем коде возникает нарушение ограничения, так как максимальное количество объектов CD должно равняться пяти, а не семи. Обратите внимание: мы используем API ConstraintViolation для проверки количества нарушений, интерполированного сообщения, возвращенного при нарушении, невалидного значения и шаблона сообщения:

CD cd = new CD();

cd.setNumberOfCDs(7);

Set> violations = validator.validateProperty(cd, "numberOfCDs");

assertEquals(1, violations.size());

assertEquals("must be less than or equal to 5", violations.iterator(). next(). getMessage());

assertEquals(7, violations.iterator(). next(). getInvalidValue());

assertEquals("{javax.validation.constraints.Max.message}",

·············violations.iterator(). next(). getMessageTemplate());

Валидация значений

Пользуясь методом Validator.validateValue(), можно проверять, удастся ли успешно валидировать конкретное свойство указанного класса при наличии у свойства заданного значения. Этот метод удобен при опережающей валидации, так как не требует даже создавать экземпляр компонента, заполнять или обновлять его значения.

Следующий код не создает объект CD, а просто ссылается на атрибут numberOfCDs класса CD. Он передает значение и проверяет, является ли свойство валидным (количество CD не должно превышать пяти):

Set> constr = validator.validateValue(CD.class, "numberOfCDs", 2);

assertEquals(0, constr.size());

Set> constr = validator.validateValue(CD.class, "numberOfCDs", 7);

assertEquals(1, constr.size());

Валидация методов

Методы для валидации параметров и возвращаемых значений методов и конструкторов вы найдете в интерфейсе javax.validation.ExecutableValidator. Метод Validator.forExecutables() возвращает этот ExecutableValidator, с которым вы можете вызывать validateParameters, validateReturnValue, validateConstructorParameters или validateConstructorReturnValue.

В следующем коде мы вызываем метод calculatePrice, передавая значение 1.2. В результате возникает нарушение ограничения, налагаемого на параметр: не выполняется условие @DecimalMin("1.4"). Для этого в коде сначала нужно создать объект java.lang.reflect.Method, нацеленный на метод calculatePrice с параметром типа Float. После этого он получает объект ExecutableValidator и вызывает validateParameters, передавая компонент, метод для вызова и значение параметра (здесь — 1.2). Затем метод удостоверяется в том, что никакие ограничения нарушены не были.

CD cd = new CD("Kind of Blue", 12.5f);

Method method = CD.class.getMethod("calculatePrice", Float.class);

Перейти на страницу:

Похожие книги

C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных
97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Нил Форд , Билл де Ора , Майкл Хайгард

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT