我试图在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
谁能告诉我发生了什么事以及我做错了什么?
感谢
杰森
答案 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
对象将单个项目作为列表包装,或者如果有多个项目则返回列表。