我在循环中分配env
变量时遇到问题。我基本上想要将用户输入表单中的所有内容复制到env:
for (elem in userInput)
env["${elem.key}"] = "${elem.value}"
然而,这失败了:
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use staticMethod
org.codehaus.groovy.runtime.DefaultGroovyMethods putAt java.lang.Object java.lang.String java.lang.Object
at org.jenkinsci.plugins.scriptsecurity.sandbox.whitelists.StaticWhitelist.rejectStaticMethod(StaticWhitelist.java:189)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onSetArray(SandboxInterceptor.java:474)
at org.kohsuke.groovy.sandbox.impl.Checker$11.call(Checker.java:438)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedSetArray(Checker.java:445)
at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.setArray(SandboxInvoker.java:49)
at com.cloudbees.groovy.cps.impl.ArrayAccessBlock.rawSet(ArrayAccessBlock.java:26)
at WorkflowScript.run(WorkflowScript:120)
at ___cps.transform___(Native Method)
...
分配这种方式有效:
env.KEY1 = userInput['KEY1']
env.KEY2 = userInput['KEY2']
但是我仍然更喜欢在循环中更新env
以避免重复和拼写错误的可能性,有没有办法以某种方式与输入数据合并?
(是的,管道是声明性的,在沙箱中运行,它应该保持原样)
答案 0 :(得分:1)
批准sandbox中的putAt
方法。
替代品可以是
env.put(elem.key, elem.value)
env."${elem.key}" = elem.value
也绝不使用此语法env["key"]
中的双引号。因为env["key"]
和env['key']
是两个不同的键。在您的示例中,如果env[elem.key]
可能不是字符串,则最好只使用env[elem.key.toString()]
或elem.key
。见Why Map does not work for GString in Groovy?