这是Grails的错误吗?

时间:2015-03-24 10:29:26

标签: 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{
      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()...

2 个答案:

答案 0 :(得分:1)

你只需要替换

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

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

你在hasMany中有两个不同的列表,它们命名用户,另一个在控制器中定义创建混淆只是更改名称。所有代码都可以正常工作。

 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                 
    }

答案 1 :(得分:1)

the other answer中所述,问题是外部作用域中的users变量与条件闭包内的users {...}调用之间的名称冲突。解决这个问题的最简单方法是重命名变量,但如果这不是一个选项,那么替代修复就是在闭包内使用delegate.

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

这消除了歧义并强制Groovy将调用发送到闭包委托(条件构建器)而不是包含作用域中的变量。你可以在与构建器名称冲突的任何其他地方使用相同的技巧,我在过去使用MarkupBuilder创建XML时必须使用它。