Почему Grails не уведомляет меня об ошибке при сохранении объекта домена?

Я только начинаю с Grails, и вот первая проблема.

Я потратил несколько часов, чтобы узнать, что объект домена не может быть вставлен в БД, пока все его свойства не будут заполнены.

class Item {
  String title
  String link
}

class ItemController {
  def fetch = {
    def item = new Item()
    item.title = "blabla"
    // no value for "link"
    item.save()
  }
}

Выглядит логично, но почему это пропущено так тихо? Могу ли я настроить что-то, чтобы получить исключения в таких случаях?

Спасибо

Ответы

Ответ 1

По умолчанию выбрано исключение.

Метод save(), введенный в класс Domain, возвращает false, если во время фазы проверки произошла ошибка. Классический пример кода для проверки сохранения/обновления класса домена:

if (!myDomainObj.save()) {
   log.warn myDomainObj.errors.allErrors.join(' \n') //each error is an instance of  org.springframework.validation.FieldError    
}

Если для определенного класса домена требуется исключение, используйте:

myDomainObj.save(failOnError: true)

и будут исключены исключения для отказов проверки.

Если вы хотите выбросить исключение для КАЖДЫХ классов домена, просто установите grails.gorm.failOnError в true в grails-app/conf/Config.groovy

Будьте осторожны: все свойства домена имеют неявное ограничение nullable: false.

Я рекомендую вам читать эту статью.

Ответ 2

Чтобы сделать вызов save() throw a RuntimeException, вы можете использовать item.save(failOnError:true). Но вы также можете проверить возвращаемое значение метода save(). Если это неверно, значит, произошло что-то неправильное.

if (item.save()) {
   //succeeded
}
else  {
   //not succeeded
}