1

我有一个 Spring Security User 类,它对用户名和电子邮件有一个唯一的约束。在一个命令类中,我使用“importFrom User”从这个类中导入了所有约束。除了唯一的约束之外,所有约束都按预期工作。

但是,在保存用户时,唯一约束得到验证并显示错误。但是,如果它们像所有其他约束一样在保存之前得到验证,那就太好了。

更新

我将此添加到控制器中:

user.errors.fieldErrors.each {
    command.errors.rejectValue(it.getField(), it.getCode())
}

似乎是一个肮脏的解决方法,但它有效。

4

3 回答 3

1

好问题@Chris,您的解决方案是最好的,因为在域类和命令对象之间共享约束的目标是避免重复验证逻辑。

我将添加它以避免重复字段错误并处理域对象中的嵌套字段路径,可能需要类似以下内容。

def save(EntityCreateCommand cmd) {
    def entity = new Entity(cmd.properties)
    def someAssociation = new Something(cmd.properties)
    entity.someAssociation = someAssociation

    entity.validate()

    entity.errors.fieldErrors.each {
        def fieldName = it.field.split("\\.").last()
        def flattenedCodes = cmd.errors.getFieldErrors(fieldName).codes.flatten()
        if(cmd.hasProperty(fieldName) && (!flattenedCodes.contains(it.code))) {
            cmd.errors.rejectValue(fieldName, 
                "entityCreateCommand.${fieldName}.${it.code}")
        }
    }

    if(cmd.errors.hasErrors()) {
        error handling stuff...
    } else {
        business stuff...
    }
}
于 2013-08-13T19:05:31.073 回答
0

我之前遇到了唯一约束的问题,所以我在我的命令对象中创建了一个自定义验证器来测试它是否是唯一的:

命令对象:

class wateverCommand{
    ....
    String username

    static constraints = {
        username validator:{value, command ->
            if(value){
                 if(User.findByUsername(value){
                     return 'wateverCommand.username.unique'
                 }
            }
        }
    }
}

在您的 messages.properties 中添加自定义错误消息:

wateverCommand.username.unique The username is taken, please pick a new username
于 2012-10-18T22:51:46.100 回答
0

我同意唯一约束似乎并不总是正确导入。因为我喜欢避免约束体中的混乱,所以我喜欢单线方法:

validator: {value, command ->  (User.findByUsername(value) ? false : true ) }

然后在你的 message.properties 中它将是:

accountCommand.username.validator.error=That username already exists
于 2013-05-15T21:57:52.187 回答