Grails 导致GORM字段的类型转换未通过验证
我有一个具有整数属性的grails域类,例如: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.
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,我不知道我在想什么。我会更新我的答案