Grails BigDecimal约束不起作用
我使用的是Grails版本2.3.3和groovy版本2.1.8 我正在使用一个在线教程来帮助学习GrailsWebdev,我创建了一个具有以下约束的域类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()
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代码时,约束不起作用!我仔细研究了一下,发现无论我为约束编写什么,它们都只在服务器第一次启动时起作用。有什么想法吗?域类约束不会自动重新加载并不奇怪,因为它们需要更改数据库模式。