导致GORM字段的类型转换失败验证

时间:2011-12-08 12:52:19

标签: grails groovy gorm

我有一个带有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禁用类型转换,或者最好在最初通过类型转换设置时失败验证。

注意:我希望通过显式设置值和默认属性构造函数来实现此功能。

可以这样做吗?

2 个答案:

答案 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')

因为演员阵容可能会在那里发生,甚至你的自定义设置器也无济于事。

相关问题