grails域约束不是像文档建议那样在运行时映射

时间:2018-12-27 23:58:22

标签: grails

文档说,根据版本,访问Domain.constraints或Domain.constrainedProperties应该给出键值映射。

https://grails.github.io/grails2-doc/2.5.4/ref/Domain%20Classes/constraints.html

  

在运行时,静态约束属性是一个Map,因此Map中的键是属性名称,而与键关联的值是ConstrainedProperty的实例:

但是,使用2.5+时,在运行时访问constraints属性并没有给出映射,而是一个闭包,并且我无法访问ConstrainedProperty实例。

我尝试使用grails类utils来访问静态属性

GrailsClassUtils.getStaticFieldValue(Domain,"constraints")//this is still a closure

GrailsClassUtils.getStaticFieldValue(Domain,"constrainedProperties")//null, this property doesn't exist below version 3.0

2 个答案:

答案 0 :(得分:2)

像文档中的示例一样,属性访问对我不起作用

Domain.constraints //returns closure

但是使用方法getter可以

Domain.getConstraints() //returns the map 

答案 1 :(得分:0)

查看位于https://github.com/jeffbrown/constraintsmapdemo的项目。

https://github.com/jeffbrown/constraintsmapdemo/blob/master/grails-app/domain/demo/Widget.groovy

package demo

class Widget {
    int width
    int height
    static constraints = {
        width range: 1..100
        height range: 1..50
    }
}

https://github.com/jeffbrown/constraintsmapdemo/blob/master/test/unit/demo/WidgetSpec.groovy处的测试通过:

package demo

import grails.test.mixin.TestFor
import spock.lang.Specification

@TestFor(Widget)
class WidgetSpec extends Specification {

    void "test accessing the constraints property"() {
        when:
        def propValue = Widget.constraints

        then:
        propValue instanceof Map
        propValue.containsKey 'width'
        propValue.containsKey 'height'
    }
}

如果您不使用静态编译,则Widget.constraints将得出Map。如果您使用静态编译,则Widget.getConstraints()将返回Map,但Widget.constraints将得出闭包。