В Play 2.0 структура проверки выходит за рамки действительной проверки данных, поскольку она достигает:
- Аннотации - для простого объявления ограничений проверки с использованием знака '@'
- Валидаторы - которые фактически реализуют логику проверки
- Сообщения - для отображения параметризованных сообщений об ошибках (совместимы с i18)
- Наконец, помощники HTML - которые склеивают все предыдущие вместе
HTML-помощники являются чем-то новым для Play 2.0.В 1.x Play уже неплохо реализовал четко определенную структуру валидации.Это был мощный и простой в использовании.Тем не менее, мы все равно должны были соединить форму HTML и структуру проверки вместе.Это может немного смущать новичка.
В Play 2.0 это теперь делается автоматически.
Но давайте сосредоточимся на ответе и предоставим некоторые рекомендации: мы создадим Валидатор AllUpperCase , который выдает ошибку, если:
- ввод не является строкой
- ввод пустой
- один из символов ниже-case.
Валидатор
package myvalidators;
import javax.validation.*;
public class AllUpperCaseValidator
extends play.data.validation.Constraints.Validator<Object>
implements ConstraintValidator<AllUpperCase, Object> {
/* Default error message */
final static public String message = "error.alluppercase";
/**
* Validator init
* Can be used to initialize the validation based on parameters
* passed to the annotation.
*/
public void initialize(AllUpperCase constraintAnnotation) {}
/**
* The validation itself
*/
public boolean isValid(Object object) {
if(object == null)
return false;
if(!(object instanceof String))
return false;
String s = object.toString();
for(char c : s.toCharArray()) {
if(Character.isLetter(c) && Character.isLowerCase(c))
return false;
}
return true;
}
/**
* Constructs a validator instance.
*/
public static play.data.validation.Constraints.Validator<Object> alluppercase() {
return new AllUpperCaseValidator();
}
}
Первое, что вы можете заметить, это импорт: Play 2.0 действительно соответствует JSR 303 - Bean Validation Framework.В этом контексте валидатору необходимо реализовать ConstraintValidator .Что в нашем случае переводит в аннотацию как класс AllUpperCase
(который мы введем через минуту) и T как универсальный Object
.
Валидатор прост:
Мы определили метод public boolean isValid (Object object) , который возвращает логическое значение, если true, проверка прошла успешно.Существует также идентификатор сообщения и метод, который создает экземпляр валидатора.
Аннотация
Класс ниже определяет аннотацию с именем @AllUpperCase
, которая не принимает параметров, но обеспечивает проверку, определенную ранее.Предоставление подробностей, относящихся к структуре аннотации, выходит за рамки этого поста.
package myvalidators;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
import javax.validation.*;
@Target({FIELD})
@Retention(RUNTIME)
@Constraint(validatedBy = AllUpperCaseValidator.class)
@play.data.Form.Display(name="constraint.alluppercase")
public @interface AllUpperCase {
String message() default AllUpperCaseValidator.message;
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
Обратите внимание, как аннотация приклеивается к другим частям головоломки.
@Constraint
,аннотация JSR 303, ссылается на валидатор @play.data.Form.Display
, связывает аннотацию с помощниками play html.Обратите внимание, что имя важно: мы определяем ограничение с именем alluppercase .Play использует эту информацию для вызова метода public static play.data.validation.Constraints.Validator<Object> alluppercase()
в Validator. - Наконец, обратите внимание, что сообщение по умолчанию установлено в интерфейсе аннотации.
Использование
Теперь у нас есть наш собственный валидатор и аннотация
import myvalidators.*;
public static class MyData {
@AllUpperCase
public String name;
}
Описание использования выходит за рамки этого поста, пожалуйста, найдите рабочий образец по этому URL