我有一个Spring Security User类,它对用户名和电子邮件有唯一的约束。在Command类中,我使用“importFrom User”从此类导入了所有约束。所有约束都按预期工作,除了唯一的约束。
但是,在保存用户时,将验证唯一约束并显示错误。但是如果他们在保存之前得到验证会很好,就像所有其他约束一样。
更新
我把它添加到控制器:
user.errors.fieldErrors.each {
command.errors.rejectValue(it.getField(), it.getCode())
}
似乎是一种肮脏的解决方法,但它确实有效。
答案 0 :(得分: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...
}
}
答案 1 :(得分: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
答案 2 :(得分:0)
我同意这种独特的约束似乎并不总能正确导入。由于我喜欢避免约束体中的混乱,我喜欢单线方法:
validator: {value, command -> (User.findByUsername(value) ? false : true ) }
然后在你的message.properties中它将是:
accountCommand.username.validator.error=That username already exists