帮助oauthService和linkedin

时间:2011-09-09 19:17:40

标签: grails grails-controller

我试图在grails控制器中迭代参数列表。当我有一个列表,超过一个元素,像这样:

     [D4L2DYJlSw, 8OXQWKDDvX]

以下代码可以正常工作:

def recipientId = params.email
recipientId.each { test->
     System.print(test + "\n")  
}

输出为:

  A4L2DYJlSw
  8OXQWKDDvX

但是,如果列表只有一个项目,则输出不是唯一的项目,而是列表中的每个字母。例如,如果我的参数列表是:

 A4L2DYJlSwD

使用与上面相同的代码,输出变为:

 A
 4
 L
 2
 D
 Y
 J
 l
 S
 w

谁能告诉我发生了什么事以及我做错了什么?

感谢

杰森

4 个答案:

答案 0 :(得分:1)

我刚才遇到同样的问题!我的解决方案是

def gameId = params.gameId
def selectedGameList = gameId.class.isArray() ? Game.getAll(gameId as List) : Game.get(gameId);

因为在我的情况下,我得到一个或多个游戏ID作为参数!

你可以做的是相同的:

def recipientId = params.email
if(recipientId.class.isArray()){
 // smtg
}else{
  // smtg
}

因为这里发生的事情是,只要你调用'.each'groovy就会在列表中转换该对象! groovy中的'String AS LIST'表示该字符串的char_array!

答案 1 :(得分:0)

我的猜测是(从我在其他地方见过的)是它试图找出recipientId的类型应该是什么,因为你没有给它一个(它是动态的)。

在你的第一个例子中,groovy决定传递给.each{}闭包的是List<String>。第二个示例,因为只有一个String,groovy决定类型应为String.each{}知道如何迭代String - 它只是将其转换为char[]

在这种情况下,您可以简单地将recipientId设为List<String>

答案 2 :(得分:0)

你也可以尝试这样:

def recipientId = params.email instanceof List ? params.email : [params.email]
recipientId.each { test-> System.print(test + "\n") }

它将处理两种情况..

答案 3 :(得分:0)

Grails提供了一种内置方法来保证特定参数是一个列表,即使只提交了一个参数。当项目数量可能为0,1或更多时,这实际上是获取项目列表的首选方式:

def recipientId = params.list("email")
recipientId.each { test->
     System.print(test + "\n")  
}

params对象将单个项目作为列表包装,或者如果有多个项目则返回列表。