如何使用Grails中的@Validateable确保与非域Command类的唯一性

时间:2014-06-24 15:13:12

标签: grails spring-validator

我有以下......

@Validateable
class Command1{
  List<Command2> subCommands
}

@Validateable
class Command2{
  String name
  Long id
}

现在我想创建一个约束来确保subCommands中的项具有唯一的名称。我的约束应该是什么样的?它应该在Command1还是Command2上?

1 个答案:

答案 0 :(得分:1)

由于Command2不了解Command1,您必须将约束放在Command1上。您可以使用自定义约束来完成此操作,因为unique约束在数据库级别进行检查,并且仅适用于域对象。

@Validateable
class Command1{
    List<Command2> subCommands

    static constraints = {
        subCommands validator: { val ->
            val.unique(false) { it.name } == val
        }
    }
}

在Groovy shell中测试但在Grails中没有:

list = [[name: 'foo'], [name: 'bar'], [name: 'baz']]
assert list.unique(false) { it.name } == list
list = [[name: 'foo'], [name: 'bar'], [name: 'bar']]
assert list.unique(false) { it.name } != list

false传递给unique()会告诉它不要就地改变列表。