Grails 导致GORM字段的类型转换未通过验证

Grails 导致GORM字段的类型转换未通过验证,grails,groovy,gorm,Grails,Groovy,Gorm,我有一个具有整数属性的grails域类,例如: class MyDomainClass { Integer i static constraints = { i(min: 0, max 5, validator: { // Something that fails when type conversion was used. } } } 如果i设置为非整数,例如3.

我有一个具有整数属性的grails域类,例如:

class MyDomainClass {

    Integer i

    static   constraints = {
        i(min: 0, max 5, 
            validator: {
                // Something that fails when type conversion was used.
            }
    }
}
如果i设置为非整数,例如3.1,由于类型转换,它将i设置为3。但我想做的是禁用I的类型转换,或者最好在最初通过类型转换设置验证时失败

注意:我希望通过显式设置值和默认属性构造函数来实现这一点


可以这样做吗?

在执行验证程序时,值已经被转换

我认为最简单的方法是创建自定义setter。 在自定义setter中,您可以获取该值,根据需要使用它,如果它不是整数,则抛出错误。如果需要,您甚至可以模拟验证异常

这种方法应该涵盖所有用例,除非您使用@运算符显式访问类的字段

编辑: 您必须确保在控制器中您没有执行以下操作:

params.getInteger('paramName')

因为强制转换可能发生在那里,甚至您的自定义setter也帮不上忙。

在执行验证程序时,值已经被强制转换

我认为最简单的方法是创建自定义setter。 在自定义setter中,您可以获取该值,根据需要使用它,如果它不是整数,则抛出错误。如果需要,您甚至可以模拟验证异常

这种方法应该涵盖所有用例,除非您使用@运算符显式访问类的字段

编辑: 您必须确保在控制器中您没有执行以下操作:

params.getInteger('paramName')

因为强制转换可能发生在那里,甚至您的自定义setter也帮不上忙。

在cusom验证器中,您应该能够从请求参数访问
i
的原始值。为此,首先需要获取当前的
HttpServletRequest
。有一个Spring/Grails助手类,允许您从任何地方获取当前请求,尽管这不是特别推荐的做法

然后,您可以测试自己该值是否真的是整数,例如

static   constraints = {
    i(min: 0, max 5, 
        validator: {
            try {
                def originalValue = getRequestParam('i')
                return true
            } catch (NumberFormatException ex) {
                return false
            }
        }
    )
}

在cusom验证器中,您应该能够从请求参数访问
i
的原始值。为此,首先需要获取当前的
HttpServletRequest
。有一个Spring/Grails助手类,允许您从任何地方获取当前请求,尽管这不是特别推荐的做法

然后,您可以测试自己该值是否真的是整数,例如

static   constraints = {
    i(min: 0, max 5, 
        validator: {
            try {
                def originalValue = getRequestParam('i')
                return true
            } catch (NumberFormatException ex) {
                return false
            }
        }
    )
}

如果从控制器调用,验证程序真的可以访问
参数吗?当从另一个没有请求的上下文调用时会发生什么?@Antoine不,他们没有
参数的ACE,我不知道我在想什么。我将更新我的应答器如果从控制器调用,验证程序是否真的有权访问
params
?当从另一个没有请求的上下文调用时会发生什么?@Antoine不,他们没有
参数的ACE,我不知道我在想什么。我会更新我的答案