2014-09-25 2 views
1

Новый проект Grails 2.3.x. Im использует автогенерированный контроллер и представления для класса домена. Одно (не пустое) свойство, которое я хочу установить непосредственно в контроллере, поэтому я удалил поле ввода из _form.gsp.grails 2.3.x: Странное поведение с автогенерируемым контроллером

класс домена:

class Demo { 
    String demo 
    String status 

    static constraints = { 
     demo nullable: false 
     status nullable: false 

} 

В форме я только заполнить демо-поле.

автогенерируемые Результаты контроллера в:

... 
@Transactional 
def save(Demo demoInstance) { 
    if (demoInstance == null) { 
     notFound() 
     return 
    } 

    // set the status property to "test" 
    demoInstance.status = "test" 

    println "1 STATUS: ${demoInstance.status}" 

    if (demoInstance.hasErrors()) { 
     println "2 STATUS: ${demoInstance.status}" 
     respond demoInstance.errors, view: 'create' 
     return 
    } 
    println "3 STATUS: ${demoInstance.status}" 
    ... 

Заполните форму и оставьте свойство статус пустых результатов в
Println 1 -> статус = 'тест'
Println 2 -> статус = 'испытательную'
Перенаправление создать страницу с сообщением: «Свойство [состояние] класса [Demo] не может быть пустым»

Когда я изменить контроллер, как в Grails 2.2.x:

... 
@Transactional 
def save() { 
    def demoInstance = new Demo(params) 

    if (demoInstance == null) { 
     notFound() 
     return 
    } 

    // set the status property to "test" 
    demoInstance.status = "test" 

    println "1 STATUS: ${demoInstance.status}" 

    if (demoInstance.hasErrors()) { 
     println "2 STATUS: ${demoInstance.status}" 
     respond demoInstance.errors, view: 'create' 
     return 
    } 
    println "3 STATUS: ${demoInstance.status}" 
    ... 

В результате ожидаемого выхода:
Println 1 -> статус = 'тест'
Println 3 -> статус = 'тест'
И вход хранится в базе данных.

Может ли кто-нибудь объяснить это поведение? Благодарю.

ответ

1

У меня была та же проблема. Не знаю точно, но что работает:
bindData (demoInstance, [status: 'test'])
У Grails 2.3 есть новое DataBinding. вы можете использовать старый стиль Spring, если вы установили
grails.databinding.useSpringBinder = true в Config.groovy
Используя этот SpringBinder, эта проблема не возникает.

+0

Thx pereiss, "grails.databinding.useSpringBinder = true" решить мою проблему. – svema

1

Я не знаю, почему вы видите поведение, которое вы видите с кодом 2.2.x, но поведение 2.3.x выглядит корректно для меня, независимо от того, какие данные вы используете. Связывание данных происходит до вызова действия контроллера, и, поскольку вы оставили свойство unset, экземпляр имеет ошибку проверки. Затем вы устанавливаете допустимое значение, но не вызываете validate() или save(), поэтому нет причин ожидать, что hasErrors() изменится с false на true.

Если добавить

demoInstance.validate() 

после

demoInstance.status = "test" 

, то я ожидал бы увидеть выход вы видите в вашем 2.2.x версии (хотя опять же, без validate или save вызова Я не могу себе представить, почему это работает в 2.2).

+0

Привет, спасибо за разъяснение. Таким образом hasErrors() является методом getter и не проверяет объект домена? Проверка будет выполняться автоматически после того, как grails свяжут свойства с объектом? – svema

+0

Правильно - было бы плохо для 'hasErrors()' иметь побочный эффект выполнения проверки; геттеры не должны вносить изменения.Единственный проверенный метод - 'validate'. –