Groovy 随机密码 找不到这样的字段:字段 java.lang.String 大小

Groovy random password No such field found: field java.lang.String size

我运行为了创建一个包含字母数字和特殊字符的随机密码

randomPasswordCreation = random_password_creation(14)
println "Random pass: $randomPasswordCreation"

def random_password_creation(pass_length ){
  def special = ['!','@','#','$','%','&'] 
  def pool = ['a'..'z','A'..'Z',0..9,'_'].flatten().plus(special);
  Random rand = new Random(System.currentTimeMillis());

  def passChars = (0..pass_length - 1).collect { pool[rand.nextInt(pool.size)] };
  def specialChar = special[rand.nextInt(special.size)]
  passChars[rand.nextInt(passChars.size)] = specialChar
  def PASSWORD = passChars.join();
  return PASSWORD
}

我收到的错误信息

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: No such field found: field java.lang.String size
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.unclassifiedField(SandboxInterceptor.java:426)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetProperty(SandboxInterceptor.java:410)
    at com.cloudbees.groovy.cps.CpsDefaultGroovyMethods.collect(CpsDefaultGroovyMethods:3170)
    at com.cloudbees.groovy.cps.CpsDefaultGroovyMethods.collect(CpsDefaultGroovyMethods:3140)
    at WorkflowScript.run(WorkflowScript:1922)

您显示的代码至少有两个问题:

  1. 你访问 size 因为它是一个字段,但它是一个方法,所以它应该是 size() 而不是。
  2. passChars.join() 缺少分隔符参数,例如'' 为空字符串。

根据错误堆栈跟踪,我假设您运行将此代码作为 Jenkins 管道的一部分。请记住,Jenkins 以更严格的方式执行 Groovy。例如,虽然常规动态 Groovy 可以处理 .size 而不是 .size() 之类的事情,但 WorkflowScript 执行程序要求 Groovy 代码没有此类错误。