grails中的自定义验证消息

时间:2012-04-02 23:45:34

标签: grails gorm grails-domain-class grails-2.0

我有一个域限制,我正在验证,如

userName(blank:false, nullable:false, Size: 5..50,matches:'^[A-Za-z\\d]*$',validator:{chkUser,user->if(user.loginService.getUser(user.organizationId,user.userName)!=null){
                                                                                                                    return[propertyName="userName"]}
                                                                                              })

所以我要做的是调用登录服务并查看用户名是否存在。如果用户名存在,我必须返回消息USerName已存在。我已将message.properties修改为:

BuildUserNameCommand.userName.matches= Username Should have alphanumeric characters only
BuildUserNameCommand.userName.invalid.userName=Username already exists
BuildUserNameCommand.userName.validator.error= Username already exists

buildusernamecommand是我的班级名称。我还在约束中尝试了return['invalid.userName']。但仍然没有显示自定义消息。

请帮帮我....

2 个答案:

答案 0 :(得分:3)

您是否看到命令对象的任何其他自定义消息,例如匹配的消息? 用户名是否在组织范围内是唯一全局的或唯一的。如果全球唯一验证很容易     独特:真

如果只是组织范围内的唯一,您可以尝试从验证器返回字符串“alreadyExists”,然后在表单中定义消息:

buildUserNameCommand.userName.alreadyExists = 'Username already exists'

如果这不起作用,另一种选择是从验证器返回false。那可能会引入消息

buildUserNameCommand.userName.validator.error= Username already exists

请注意班级名称上的小写 b 。不确定这个类是否需要以小写字母开头,但是在我的代码中,它们似乎更符合Grails模式。

答案 1 :(得分:3)

如果您只有Users作为域对象,则使用unique约束会更容易:

username unique: true

然后,在您的情况下,要定义的消息代码将是buildUserNameCommand.userName.unique - 并且约束为您完成所有操作。它还将生成数据库模式唯一性约束。