2014-09-19 6 views
0

У нас есть класс, как это в Grails 2.4.3 приложения (мигрировали из 2.3.8):Grails проверки полей со значениями по умолчанию

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

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

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

[ 
    noDefault: 0, 
    withDefault: 2 
] 

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

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

Thanx заранее, с наилучшими пожеланиями: Балаж

+0

Вы уверены, что 'Map', который вы связываете, действительно не содержит значения для' withDefault'? Если он содержит значение, которое является нулевым, что объясняет поведение, которое вы видите. Если «Карта» действительно не содержит значения для 'withDefault', то поведение, которое вы описываете, для меня не имеет смысла. Должен быть какой-то другой фактор, который не выражен в описании. См. Код, который я разместил ниже, и если вы можете ограничить специфику проблемного сценария, я с удовольствием рассмотрю его. Удачи. –

+0

Случайный снимок в темноте, но может ли имя свойства ('withDefault') каким-то образом сталкиваться с методом Groovy' Map.withDefault() '? –

+0

Эндрю, это кажется мне маловероятным. Сценарий, как описано, является тем, где на карте нет данных для withDefault. Даже если бы это было, все равно должно работать, но поскольку с помощью Default даже нет на карте, я не знаю, как это может быть актуально. –

ответ

0

То, что вы описываете, это не согласуется с тем, что я ожидал бы и не согласуется с поведением, что я вижу. Проект на 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 = { 
    } 
} 

Я надеюсь, что это поможет.

+0

Ваш пример работает, и тест проходит мимо меня. Я попробовал настоящее приложение еще раз, и на этот раз он сработал. Причина таинственная - я часто вижу необъяснимые ошибки, возникающие на моей JVM, и они продолжают повторяться даже на один день. Независимо от того, как я делаю grailsw clean, удаляйте workdir или перезагружайте систему. JVM поврежден, переустановка его или другая версия тоже не помогает. Извините за ложный вопрос. –

Смежные вопросы