我有一个带有Integer属性的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禁用类型转换,或者最好在最初通过类型转换设置时失败验证。
注意:我希望通过显式设置值和默认属性构造函数来实现此功能。
可以这样做吗?
答案 0 :(得分:3)
在您的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
}
}
)
}
答案 1 :(得分:0)
到执行验证器时,值已经被转换。
我认为最简单的方法是创建自定义setter。 在自定义setter中,您可以获取值,根据需要执行操作,如果不是Integer则抛出错误。如果需要,您甚至可以模拟验证异常。
除非您使用。@ operator明确访问类的字段,否则此方法应涵盖您的所有用例。
编辑: 你必须确保在你的控制器中你没有这样做:
params.getInteger('paramName')
因为演员阵容可能会在那里发生,甚至你的自定义设置器也无济于事。