Play Framework: применяется автоматическая проверка методов контроллера?

У меня есть проблема с проверкой параметров, переданных методу контроллера.

Следуя предложению из учебника, я использую тот же метод контроллера для «сохранения» и «создания нового» объекта. См. пример в http://www.playframework.org/documentation/1.2.4/guide9< /а>

Итак, мой метод контроллера выглядит так:

public static void saveEntity(long l, Long itemId,  
  @Required(message="error.shouldspecifyname") String name, 
  @Required(message="error.shouldspecifycategory")  String category)

Если «itemId» не является частью данных, отправляемых через HTTP-запрос, предполагается, что для него установлено значение «null».

К сожалению, похоже, что "Play" автоматически добавляет ошибку проверки к параметру "отсутствует".

При просмотре списка ошибок проверки каждый раз, когда «itemId» имеет значение «null», я получаю сообщение об ошибке Неверное значение для поля itemId.

Это задокументированное поведение? Любой способ переопределить его или «избавиться» от ошибки.

Я обрабатываю ошибки, просто используя перенаправление, например:

if(validation.hasErrors() ) 
{

            validation.keep();
            showSomePage();         
}

Таким образом, ошибки отображаются «вне контекста», они генерируются. По этой причине меня беспокоит "автоматическая" ошибка.

Спасибо за любую подсказку.


person Max    schedule 04.03.2012    source источник


Ответы (1)


Скорее всего, ему не удается проверить itemId, потому что он объявлен как Long. Вы уверены, что у вас есть «Long», а не просто «long»? Мы везде используем проверку с контроллерами, и она работает с @Required и передает значения «null» в «Long».

В худшем случае вы можете удалить ошибку из объекта проверки на основе ключа «itemId», также, если вы используете контроллер для сохранения объекта модели, вы можете использовать:

public static void saveEntity(@Required @Valid MyEntity entity) {
if(validation.hasErrors() ) {
  validation.keep();
  showSomePage();         
}
entity.save();
}

Он автоматически перехватит ваши изменения внутри существующего объекта, если вы передадите идентификатор со страницы с помощью:

<input type="hidden" name="myEntity.id" value="${myEntity.id}">
person Alexander Ponomarenko    schedule 04.03.2012
comment
Спасибо, что предложили альтернативу. Иногда есть ли способ удалить проверку по ключу? Из моих испытаний список errors() является клоном исходного списка, поэтому любая операция с ним не изменит данные, отправленные на перенаправленную страницу. - person Max; 05.03.2012
comment
Вы не можете удалить ошибку по идентификатору, но вы можете использовать что-то вроде: if(validation.hasError(itemId) && validation.errors().size() == 1) { validation.clear(); } - person Alexander Ponomarenko; 05.03.2012