Играть: Пользовательские ограничения Ebean

Я только начал с Play и пытаюсь получить некоторые пользовательские ограничения для моей модели.

Я обнаружил, что это работает

@Constraints.Required
@Constraints.MaxLength(15)
@Constraints.MinLength(4)
@Constraints.Pattern(value = "^\\w\\s$")
public String username;

Но теперь я хочу добавить пользовательское ограничение с собственной реализацией (для проверки уникальности). Поэтому я попробовал это (оно было автоматически заполнено моей IDE, поэтому оно существует)

@Constraints.ValidateWith(Account.UniqueValidator.class)
public String username;

Я где-то нашел (прошел много ссылок, поэтому больше не могу найти, что класс должен расширять Constraints.Validator

Так я и сделал.

 private class UniqueValidator extends Constraints.Validator<String>
{

    @Override
    public boolean isValid(String s) {
        return Account.find.where().eq("username", s).findRowCount() == 0;
    }

    @Override
    public F.Tuple<String, Object[]> getErrorMessageKey() {
        return null;
    }
}

Однако я не знаю, что возвращать в значении getErrorMessageKey, это обязательный метод для реализации. Я посмотрел в источнике игры и нашел «что-то», похожее на это. А именно валидатор NotEmpty.

Однако, когда вы посмотрите туда, вы увидите, что он возвращает Tuple, а не F.Tuple. Когда я меняю это в своем коде, он жалуется, что это не F.Tuple.

Пытался вернуться

return Tuple("error.invalid", new Object[] {});

Как это сделано в приведенной выше ссылке на валидатор NotEmpty. Но затем он говорит, что ему нужно «новое» перед Tuple, но это дает мне класс с кучей необходимых методов для реализации. Так что я думаю, что это не совсем выход.


Когда я просматриваю документацию по игре здесь, мне нужно использовать аннотацию @CheckWith , но когда я выбираю это, он говорит, что не может найти аннотацию @CheckWith.

Я потерян. :-)


person Matthijn    schedule 13.09.2013    source источник


Ответы (1)


Обратите внимание, что F.Tuple — это тип шаблона, для которого требуются два аргумента шаблона, но в операторе return, который вы попробовали, вы не указали никаких аргументов шаблона.

Чтобы ваш код заработал, просто измените строку

return Tuple("error.invalid", new Object[] {});

to

return new Tuple<String, Object[]>("error.invalid", new Object[] {});

В качестве альтернативы вы можете написать

return F.Tuple("error.invalid", new Object[] {});

В этом операторе F.Tuple — это статический фабричный метод, который создает и возвращает Tuple с правильными аргументами шаблона.

person Aaron Cohn    schedule 10.12.2013