grailsgorm整数验证

grailsgorm整数验证,grails,gorm,Grails,Gorm,环境:Grails2.0.4、Java1.6.0 我想对域对象值设置一个约束,该值需要一个整数值,以防止输入十进制值。在视图中输入3.3将创建值为3的对象。我希望验证错误会反馈给用户,指示只有整数值是有效的 class ADomainObject { Integer anInteger } 控制器 def save() { // Note: params["anInteger"] = "3.3" ADomainObject aDomainObject = new A

环境:Grails2.0.4、Java1.6.0

我想对域对象值设置一个约束,该值需要一个整数值,以防止输入十进制值。在视图中输入3.3将创建值为3的对象。我希望验证错误会反馈给用户,指示只有整数值是有效的

class ADomainObject {
    Integer    anInteger
}
控制器

def save() {
   // Note: params["anInteger"] = "3.3"

   ADomainObject aDomainObject = new ADomainObject(params)
   aDomainObject.save flush:true
}
导致aDomainObject.aInteger=3的持久性


需要什么类型的约束才能导致失败?我尝试使用范围约束[0..1000],但没有效果。

也许您可以使用如下自定义验证器:

static constraints = {
        anInteger validator: {
            //aDomainObject. anInteger.invalid.type
            if (!(it instanceOf Integer)) return ['invalid.type']
        }
    }

您可以为
整数注册自定义属性编辑器,以仅允许严格的整数值。以下内容将应用于绑定所有整数

class IntegerEditor extends java.beans.PropertyEditorSupport {
    void setAsText(String text) {
        value = Integer.parseInt(text)
    }
}

class CustomPropertyEditorRegistrar implements org.springframework.beans.PropertyEditorRegistrar {
    void registerCustomEditors(org.springframework.beans.PropertyEditorRegistry registry) {
        registry.registerCustomEditor(Integer, new IntegerEditor())
    }
}
然后在resources.groovy中:

beans = {
    customPropertyEditorRegistrar(CustomPropertyEditorRegistrar)
}

我认为这不起作用,因为此时该值已经绑定到整数字段。这会引发验证错误吗?因为我认为它会在验证任何东西之前抛出一个类型不匹配错误,这将传播到验证错误
setAsText()
可以抛出一个
IllegalArgumentException
,由
parseInt()
引发的
NumberFormatException
扩展了该异常。Spring将抛出的异常解释为验证错误。感谢您的回答!我是否期望这是默认行为?这不是我所缺少的默认行为,有什么原因吗?这很有效,唯一的问题是,如果我使用这种方法,我不再有错误的值放回cmd对象所支持的形式。关于如何将无效值返回UI以显示在输入字段中,您有什么想法吗?