Grails проверяет поля со значениями по умолчанию

У нас есть такой класс в приложении Grails 2.4.3 (перенесен с 2.3.8):

@Validateable
class Foo {
    Integer noDefault;
    Integer withDefault = 1;

    static constraints = {
        noDefault(nullable:false)
        withDefault(nullable:false)
    }
}

Этот класс создается в сложном механизме конфигурации с использованием Map:

[
    noDefault: 0,
    withDefault: 2
]

(На самом деле Map является частью огромного, но конструктор класса видит этот маленький.) Раньше класс работал, если мы пропустили запись withDefault из карты конфигурации, используя значение по умолчанию, которое не является нулевым. Однако в Grails 2.4.3 это говорит мне, что это поле не может быть нулевым. Я могу исправить это, допустив нулевое значение в ограничении, но это позволяет установить явное значение null (и перезаписать значение по умолчанию), что вызывает проблемы во время работы.

Знаете ли вы какой-нибудь обходной путь, который сохраняет семантику и правильную работу?

Спасибо заранее, с наилучшими пожеланиями: Balázs

1 ответ

Решение

То, что вы описываете, не соответствует ожиданиям и не соответствует поведению, которое я наблюдаю. Проект по адресу https://github.com/jeffbrown/validatedefaults содержит следующий код.

На https://github.com/jeffbrown/validatedefaults/blob/master/src/groovy/demo/Foo.groovy

// src/groovy/demo/Foo.groovy
package demo

import grails.validation.Validateable

@Validateable
class Foo {
    Integer noDefault;
    Integer withDefault = 1;

    static constraints = {
        noDefault(nullable:false)
        withDefault(nullable:false)
    }
}

Тест на https://github.com/jeffbrown/validatedefaults/blob/master/test/unit/demo/FooSpec.groovy проходит:

// test/unit/demo/FooSpec.groovy
package demo

import spock.lang.Specification
import grails.test.mixin.TestMixin
import grails.test.mixin.support.GrailsUnitTestMixin

@TestMixin(GrailsUnitTestMixin)
class FooSpec extends Specification {

    void 'test validating default values'() {
        given:
        def map = [noDefault: 0]
        def foo = new Foo(map)

        expect:
        foo.validate()
    }
}

Когда я запускаю приложение, у меня такое же поведение.

// grails-app/conf/BootStrap.groovy
import demo.Foo

class BootStrap {

    def init = { servletContext ->
        def map = [noDefault: 0]
        def foo = new Foo(map)

        // this prints true...
        println "Foo is valid? : ${foo.validate()}"
    }
    def destroy = {
    }
}

Надеюсь, это поможет.

Другие вопросы по тегам