Как создать пользовательский валидатор в Play Framework 2.0?

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

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

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

Ответы

Ответ 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