Grails BigDecimal约束不起作用

时间:2013-12-01 17:30:38

标签: grails constraints

我使用的是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类型字段。

2 个答案:

答案 0 :(得分:1)

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

  

实现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.0new BigDecimal(100.00)改为100.00,如下所示:

cost(min: 0.0, max: 100.0)

Here is the documentation声明:

  

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

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

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