数据验证
除了指定字段顺序, static constraints 块还允许在里面放置一些验证规则。例如,可以在 String 字段上施加长度限制(默认是 255 个字符)。这样就能确保 String 值与指定的模式(例如电子邮件地址或 URL)匹配。甚至还能将字段设置为可选或必需的。关于可用的验证规则的完整列表,请参阅 Grails 的联机文档(请参阅 参考资料)。
清单 8 显示的 Airline 类中在约束块内添加了验证规则:
清单 8. 将数据验证添加到 Airline
class Airline {
static constraints = {
name(blank:false, maxSize:100)
url(url:true)
frequentFlyer(blank:true)
notes(maxSize:1500)
}
static hasMany = [trip:Trip]
String name
String url
String frequentFlyer
String notes
String toString(){
return name
}
}
static constraints = {
name(blank:false, maxSize:100)
url(url:true)
frequentFlyer(blank:true)
notes(maxSize:1500)
}
static hasMany = [trip:Trip]
String name
String url
String frequentFlyer
String notes
String toString(){
return name
}
}
保存修改后的 Airline.groovy 文件,在浏览器中新建一条航线。如果违反了验证规则,会收到警告,如图 4 所示:
图 4. 验证警告

可以在 grails-app/i18n 目录的 messages.properties 文件中对警告消息进行自定义。请注意,默认的消息已经用多种语言进行了本地化(请参阅 Grail 联机文档中的验证一节,了解如何在每个类、每个字段的基础上创建自定义消息)。
清单 8 中的多数约束只影响视图层,但是有两个约束也会影响持久层。例如,数据库中的 name 列现在是 100 个字符长。notes 字段除了从输入字段转为视图的文本区域之外(对于大于 255 个字符的字段会进行这个转换),还从 VARCHAR 列转为 TEXT、CLOB 或 BLOB 列。这些转变取决于在后台使用的数据库类型和它的 Hibernate 方言 — 当然,这些也是可以修改的。