Grails 是圣杯的虫子吗?

Grails 是圣杯的虫子吗?,grails,Grails,当我输入这些代码时,它工作得非常好 def users = User.getAll(params.userChecked)*.id println 'user : ' + users 但当我这样做的时候,它显示了错误 def users = User.getAll(params.userChecked)*.id println 'user : ' + users def x = [1, 2] x.each(){ def roles = Role.withCriteria{

当我输入这些代码时,它工作得非常好

def users = User.getAll(params.userChecked)*.id 
println 'user : ' + users 
但当我这样做的时候,它显示了错误

def users = User.getAll(params.userChecked)*.id 
println 'user : ' + users 

def x = [1, 2]
x.each(){
  def roles = Role.withCriteria{
      users {
             eq 'id', new Long(80)
            }  
  }  
  println roles                 
}
但是当我删除上面的代码时,下面的代码正常工作

def x = [1, 2]
x.each(){
  def roles = Role.withCriteria{
      users {
             eq 'id', new Long(80)
            }  
  }  
  println roles                 
}
我不明白怎么了?这是错误

No signature of method: java.util.ArrayList.call()...
你只要替换

def users = User.getAll(params.userChecked)*.id 

您有两个不同的列表,一个在hasMany中,命名为用户,另一个在controller中定义,造成混乱的只是更改名称。所有代码都可以正常工作

 def users = User.getAll(params.userChecked)*.id 
    println 'user : ' + users 

    def x = [1, 2]
    x.each(){
      def roles = Role.withCriteria{
          users {
                 eq 'id', new Long(80)
                }  
      }  
      println roles                 
    }
如中所述,问题在于外部作用域中的
users
变量与条件闭包中的
users{…}
调用之间的名称冲突。解决此问题的最简单方法是重命名变量,但如果这不是一个选项,则另一种解决方法是在闭包内使用
委托。

def roles = Role.withCriteria{
  delegate.users {
    eq 'id', new Long(80)
  }
}

这消除了歧义,并强制Groovy将调用发送给闭包委托(标准生成器),而不是包含范围中的变量。在其他任何与构建器名称冲突的地方都可以使用相同的技巧,我过去在使用
MarkupBuilder

创建XML时不得不使用它。问题的根源在于,当在调用
withCriteria
时,范围内有一个名为
users
的变量时,
users{…}标准闭包中的
块被Groovy视为对作用域内
用户
对象的
调用
方法的调用,而不是对标准生成器(闭包委托)上的
用户
方法的调用。
def roles = Role.withCriteria{
  delegate.users {
    eq 'id', new Long(80)
  }
}