Ответ 1
В Play 2.0 структура проверки выходит за рамки фактической проверки данных по достижению:
- Аннотации - легко объявить отклонения проверки, используя знак "@"
- Валидаторы - которые фактически реализуют логику за проверкой
- Сообщения - отображение параметризованных сообщений об ошибках (соответствует i18)
- Наконец, HTML-помощники - которые склеивают все предыдущие вместе.
Помощники HTML - это что-то новое для воспроизведения 2.0. В версии 1.x Play был довольно хорош для обеспечения корректной структуры проверки. Он был мощным и простым в использовании. Однако нам все равно пришлось объединить HTML-форму и структуру проверки. Это может быть немного запутанным для новичка.
В Play 2.0 это делается автоматически.
Но давайте сосредоточимся на ответе и дадим некоторые рекомендации: мы создадим валидатор AllUpperCase, который генерирует ошибку, когда:
- вход не является строкой
- вход пуст
- один из символов является строчным.
Валидатор
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), который возвращает логическое значение, если 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()
на валидаторе. - Наконец, обратите внимание, что сообщение по умолчанию установлено в интерфейсе анотации.
Использование
Теперь у нас есть пользовательский валидатор и аннотация
import myvalidators.*;
public static class MyData {
@AllUpperCase
public String name;
}
Описание использования выходит за рамки этой публикации, пожалуйста, найдите рабочий образец этого URL