Как создать собственный валидатор в Play Framework 2.0? - PullRequest
17 голосов
/ 14 ноября 2011

Play 1.0 поставляется с полнофункциональной базой валидации на http://oval.sourceforge.net/.

С выпуском 2.0 мои пользовательские валидаторы больше не работают.

Как создать собственный валидатор с помощьюPlay Framework 2.0?

1 Ответ

41 голосов
/ 14 ноября 2011

В 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

...