Проверка модели Play Framework (Java) - разные проверки для create () и update ()

1

Я использую Play 2.3.7, и я в основном имеют один и тот же вопрос, как это, но я использую Java, и я не знаю, Scala.

В моем случае у меня есть класс CSVData с атрибутом name который я хочу быть уникальным. В моих действиях контроллера для create() и update(Long id) я привязываю форму к этому классу с помощью

Form<CSVData> formData = Form.form(CSVData.class).bindFromRequest();

Как поясняется в документации Play, функция validate() bindFromRequest(). Здесь моя текущая функция проверки:

public List<ValidationError> validate() {

    List<ValidationError> errors = new ArrayList<ValidationError>();

    // Unique validation on name
    if(CSVData.find.where().eq("name", getName()).findRowCount() != 0) {
        errors.add(new ValidationError("name", "Name must be unique. That value is already taken."));
    }

    // other stuff

}

Очевидно, что проблема с моим текущим решением заключается в том, что при вызове update() в базе данных уже есть строка с этим именем. Этот ответ предполагает проверку атрибута id объекта в действии контроллера, а затем предоставляет фрагмент кода Scala, но этот пример содержит класс User, а мое приложение - нет. Как я могу проверить, совпадает ли объект в базе данных с совпадающим name который я сейчас обновляю? Должен ли я проверить это в функции validate() или в моем контроллере?

  • 0
    см. этот вопрос для решения того, как я проверил уникальность, которая была основной проблемой, с которой я столкнулся
Теги:
playframework
validation
playframework-2.3

2 ответа

0
Лучший ответ

Невозможно выполнить различные проверки для create() и update() в функции validate() в модели, но вы можете выполнять проверки в соответствующих действиях контроллера, например

public static Result create() {

    Form<CSVData> formData = Form.form(CSVData.class).bindFromRequest();

}    

public static Result update() {

    Form<CSVData> formData = Form.form(CSVData.class).bindFromRequest();

    if( !formData.hasErrors() ){
        if(formData.field("name").value().equals( .... ) {
            // do some check here
            // add ValidationError if needed
        }
    }

}

Раньше я не рассматривал выполнение проверок непосредственно в контроллере, но это возможно.

0

Создайте два отдельных класса: один для insert() - InsertCsvData и один для updated() - UpdateCsvData с двумя различными реализациями validate(). При желании, создайте базовый класс для хранения общих свойств/поведения.

  • 0
    Я полагаю, это может сработать, но я бы предпочел более чистое решение. Также, скажем, базовый класс - CSVData , тогда в моем шаблоне представления я хотел бы передать @(csvForm: Form[CSVData]) . Однако я получаю ошибку компиляции для несоответствия типов. Note: models.InsertCSVData <: models.CSVData, but Java-defined class Form is invariant in type T. Как бы я изменил шаблоны представления Scala, чтобы они принимали форму типа базы? класс?
  • 0
    Используйте @(csvForm: Form[_ <: CSVData]) scala: @(csvForm: Form[_ <: CSVData])
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню