进入/退出块的Groovy语法

时间:2018-03-20 12:33:31

标签: groovy

有没有办法用自定义打开和关闭方法定义块/环境?目前,我有:

script {
   withCredentials([usernamePassword(credentialsId: '...', usernameVariable: 'CONFIG_USER', passwordVariable: 'CONFIG_PASS')]) {
      def sql = Sql.newInstance("...", CONFIG_USER, CONFIG_PASS, "com.mysql.jdbc.Driver")
      sql.rows("SELECT * FROM visualization").each { row ->
         println "row ${row.branch}"
      }
      sql.close()
   }
}

我希望能够做到:

with sqlConnection() { sql ->
   sql.rows("SELECT * FROM visualization").each { row ->
      println "row ${row.branch}"
   }
}

相应地自动打开/关闭连接的位置。我是Groovy的新手,所以它是我所关注的语法。在Python中,我会使用对象__enter__ / __exit__来执行此操作。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您需要一个新方法python3.4 manage.py runserver my_domain.com:8000执行sqlConnection()部分吗?

您可以使用闭包参数在其他内容之前或之后执行某些操作。

withCredentials

可以像这样使用

def sqlConnection(Closure withSqlClosure) {
    withCredentials([usernamePassword(credentialsId: '...', usernameVariable: 'CONFIG_USER', passwordVariable: 'CONFIG_PASS')]) {
        Sql.newInstance("...", CONFIG_USER, CONFIG_PASS, "com.mysql.jdbc.Driver").withCloseable {sql ->
            withSqlClosure(sql)
        }
    }
}

因此,在调用闭包(sqlConnection() { sql -> sql.rows("SELECT * FROM visualization").each { row -> println "row ${row.branch}" } } )之前的所有内容都与withSqlClosure(sql)对应,呼叫后的所有内容都是__enter__。请注意,您需要留意异常。通常,您希望将闭包调用包装在__exit__语句中。在这里,我使用try { ... } finally { ... }为我们执行此操作(假设withCloseable返回Sql.newInstance)。

为了帮助您启用IDE并启用Closeable,您还应添加@CompileStatic

@ClosureParams

此处def sqlConnection( @ClosureParams(value = groovy.transform.stc.SimpleType, options = ["your.sql.type"]) Closure withSqlClosure) { withCredentials([usernamePassword(credentialsId: '...', usernameVariable: 'CONFIG_USER', passwordVariable: 'CONFIG_PASS')]) { Sql.newInstance("...", CONFIG_USER, CONFIG_PASS, "com.mysql.jdbc.Driver").withCloseable {sql -> withSqlClosure(sql) } } } your.sql.type的返回类型。