【问题标题】:Grails BigDecimal constraints not workingGrails BigDecimal 约束不起作用
【发布时间】:2013-12-01 17:30:38
【问题描述】:

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

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

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”这样的值。我注意到整数字段 maxRunners 工作正常,因为如果我尝试输入 -1 maxRunners,它会显示一条警告消息。我将成本字段更改为整数类型,然后约束开始起作用。

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

【问题讨论】:

    标签: grails constraints


    【解决方案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)
    

    可以解决问题吗?

    【讨论】:

    • 我想我对出了什么问题有了更多了解,尽管我仍然不知道为什么。当我运行 grails run-app 时,服务器启动,我去创建一个新的 Race 没有进行任何您建议的更改,并且约束起作用了!我无法以 -1 的成本或 -1 的距离进行比赛。但是当我将代码更改为您的建议之一,并且 grails 重新编译了我的 Race.groovy 代码时,约束不起作用!我玩弄了它,发现无论我为约束写什么,它们只有在服务器首先启动时才起作用。有什么想法吗?
    • 域类约束不会自动重新加载并不让我感到惊讶,因为它们需要更改数据库架构。
    【解决方案2】:

    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 声明:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      • 2018-12-30
      • 2015-03-13
      • 2017-08-24
      • 2014-11-20
      相关资源
      最近更新 更多