我使用的是Grails版本2.3.3和groovy版本2.1.8。
我正在使用在线教程来帮助学习Grails web dev,我创建了一个具有以下约束的域类
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
}
我正在使用脚手架,所以我有完整的CRUD功能。问题是,当我去创建一个新的Race时,应用程序允许我在距离和成本字段中输入“-1”等值,并在成本字段中输入“200”等值。我注意到Integer字段maxRunners工作正常,因为如果我尝试输入-1 maxRunners,它会显示一条警告消息。我将成本字段更改为Integer类型,然后约束开始工作。
为什么会这样?我将教程中的代码复制并粘贴到我的文本文件中,约束不适用于BigDecimal类型字段。
答案 0 :(得分:1)
根据min
和max
约束的文档,参数必须为
实现java.lang.Comparable的类。值的类型必须与属性相同。
所以我看不出你的定义不起作用的任何理由。作为解决方法,您可以尝试替换此
cost(min: new BigDecimal(0.0), max: new BigDecimal(100.0))
与
cost(range: 0..100)
你可以替换这个约束:
distance(min: 0.0)
使用自定义验证器,例如
distance validator: {
it >= 0.0
}
我刚刚注意到在2个有问题的约束
之前出现的以下奇怪现象startDate()
也许用以下任何一个替换它:
startDate(nullable: true)
或
startDate(nullable: false)
可能会解决问题吗?
答案 1 :(得分:1)
默认情况下,Groovy不使用java.math.BigDecimal
吗?您是否可以将new BigDecimal(0.0)
更改为0.0
和new BigDecimal(100.00)
改为100.00
,如下所示:
cost(min: 0.0, max: 100.0)
为了支持“最不令人惊讶”的方法,带有小数点的groovy文字被实例化为java.math.BigDecimal类型而不是二进制浮点类型(Float,Double)。
此外,您可以尝试使用G
后缀强制它,如下所示:
cost(min: 0.0G, max: 100.0G)