Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails BigDecimal约束不起作用_Grails_Constraints - Fatal编程技术网

Grails BigDecimal约束不起作用

Grails BigDecimal约束不起作用,grails,constraints,Grails,Constraints,我使用的是Grails版本2.3.3和groovy版本2.1.8 我正在使用一个在线教程来帮助学习GrailsWebdev,我创建了一个具有以下约束的域类 package racetrack class Race { static constraints = { name(blank:false, maxSize:50) city(blank:false) state(inList:["GA", "NC", "SC", "VA"]) startDate()

我使用的是Grails版本2.3.3和groovy版本2.1.8

我正在使用一个在线教程来帮助学习GrailsWebdev,我创建了一个具有以下约束的域类

package racetrack



class Race {

static constraints = {
    name(blank:false, maxSize:50)
    city(blank:false)
    state(inList:["GA", "NC", "SC", "VA"])
    startDate()
    distance(min: 0.0) 
    cost(min: new BigDecimal(0.0), max: new BigDecimal(100.0))
    maxRunners(min:0, max:100000)
}

String name
Date startDate
String city
String state
BigDecimal distance
BigDecimal cost 
Integer maxRunners

}
startDate()
我使用脚手架,所以我有完整的积垢功能。问题是,当我开始创建一个新的比赛时,应用程序允许我在距离和成本字段中输入“-1”这样的值,在成本字段中输入“200”这样的值。我注意到整数字段maxRunners工作正常,因为如果我尝试输入-1 maxRunners,它会显示一条警告消息。我将成本字段更改为整数类型,然后约束开始工作


为什么会这样?我将教程中的代码复制并粘贴到我的文本文件和约束中,使其不适用于BigDecimal类型的字段。

根据
min
max
约束的文档,参数必须为

实现java.lang.Comparable的类。值的类型必须与属性的类型相同

所以我看不出你的定义不起作用的原因。作为解决方法,您可以尝试替换此

cost(min: new BigDecimal(0.0), max: new BigDecimal(100.0))

您可以替换此约束:

distance(min: 0.0)
使用自定义验证器,例如

distance validator: {
    it >= 0.0
}
我刚刚注意到,在2个有问题的约束之前出现了以下奇怪之处

package racetrack



class Race {

static constraints = {
    name(blank:false, maxSize:50)
    city(blank:false)
    state(inList:["GA", "NC", "SC", "VA"])
    startDate()
    distance(min: 0.0) 
    cost(min: new BigDecimal(0.0), max: new BigDecimal(100.0))
    maxRunners(min:0, max:100000)
}

String name
Date startDate
String city
String state
BigDecimal distance
BigDecimal cost 
Integer maxRunners

}
startDate()
或许可以用以下两种方式来代替:

startDate(nullable: true)


可能会解决问题吗?

Groovy默认情况下不使用
java.math.BigDecimal
?您能否将
new BigDecimal(0.0)
更改为
0.0
并将
new BigDecimal(100.00)
更改为
100.00
,如下所示:

cost(min: 0.0, max: 100.0)
cost(min: 0.0G, max: 100.0G)
该条规定:

为了支持“最不奇怪”的方法,带有小数点的groovy文本被实例化为java.math.BigDecimal类型,而不是二进制浮点类型(Float,Double)

此外,您还可以尝试使用
G
后缀来强制执行它,如下所示:

cost(min: 0.0, max: 100.0)
cost(min: 0.0G, max: 100.0G)

我想我已经了解了更多关于哪里出了问题,尽管我仍然不知道为什么。当我运行grailsrun应用程序时,服务器启动了,我开始了一场新的比赛,没有做任何您建议的更改,约束也起了作用!我不能以-1的成本或-1的距离进行比赛。但是,当我将代码更改为您的建议之一,grails重新编译了我的Race.groovy代码时,约束不起作用!我仔细研究了一下,发现无论我为约束编写什么,它们都只在服务器第一次启动时起作用。有什么想法吗?域类约束不会自动重新加载并不奇怪,因为它们需要更改数据库模式。