簡體   English   中英

Groovy腳本中的MissingMethodException

[英]MissingMethodException in groovy scripting

我是groovy腳本的新手。 我在遠程機器上運行腳本。 像往常一樣使用jfrog delete構件腳本( https://www.jfrog.com/blog/advanced-cleanup-using-artifactory-query-language-aql/ )。 根據我的要求更新了主機。但是每次運行命令時,我都會丟失方法異常。

Artifactory 4.1.3 rev 40020 PRO

@Grab(group = 'org.codehaus.groovy.modules.http-builder', module = 'http-builder', version = '0.6')
import groovyx.net.http.RESTClient
import groovyx.net.http.HttpResponseException
import org.apache.http.conn.HttpHostConnectException
    /**
     * Created by shaybagants on 4/30/15.
     */

def query = 'items.find({"type" : "file","name":{"$eq":"webapp-194-20140604002145-7c157a8afcd3e8fc6a9ecbbf0ec45153991ef23d.war"}})' // replace this with your AQL query
def artifactoryURL = 'http://localhost:8081/artifactory/' // replace this with your Artifactory server
def restClient = new RESTClient(artifactoryURL)
restClient.setHeaders(['Authorization': 'Basic ' + "admin:password".getBytes('iso-8859-1').encodeBase64()]) //replace the 'admin:password' with your own credentials
def dryRun = true //set the value to false if you want the script to actually delete the artifacts

def itemsToDelete = getAqlQueryResult(restClient, query)
if (itemsToDelete != null && itemsToDelete.size() > 0) {
    delete(restClient, itemsToDelete, dryRun)
} else {
    println('Nothing to delete')
}

/**
 * Send the AQL to Artifactory and collect the response.
 */
public List getAqlQueryResult(RESTClient restClient, String query) {
    def response
    try {
        response = restClient.post(path: 'api/search/aql',
            body: query,
            requestContentType: 'text/plain'
        )
    } catch (Exception e) {
        println(e.message)
    }
    if (response != null && response.getData()) {
        def results = [];
        response.getData().results.each {
            results.add(constructPath(it))
        }
        return results;
    } else return null
}

/**
 * Construct the full path form the returned items.
 * If the path is '.' (file is on the root) we ignores it and construct the full path from the repo and the file name only
 */
public constructPath(HashMap item) {
    if (item.path.toString().equals(".")) {
        return item.repo + "/" + item.name
    }
    return item.repo + "/" + item.path + "/" + item.name
}

/**
 * Send DELETE request to Artifactory for each one of the returned items
 */
public delete(RESTClient restClient, List itemsToDelete, def dryRun) {
    dryMessage = (dryRun) ? "*** This is a dry run ***" : "";
    itemsToDelete.each {
        println("Trying to delete artifact: '$it'. $dryMessage")
        try {
            if (!dryRun) {
                restClient.delete(path: it)
            }
            println("Artifact '$it' has been successfully deleted. $dryMessage")
        } catch (HttpResponseException e) {
            println("Cannot delete artifact '$it': $e.message" +
                ", $e.statusCode")
        } catch (HttpHostConnectException e) {
            println("Cannot delete artifact '$it': $e.message")
        }
    }
}

例外

Caught: groovy.lang.MissingMethodException: No signature of method: test.constructPath() is applicable for argument types: (groovy.json.internal.LazyMap) values: [[created:2014-06-04T00:21:55.149Z, created_by:jenkins, modified:2014-06-04T00:21:55.146Z, ...]]
Possible solutions: constructPath(java.util.HashMap)
groovy.lang.MissingMethodException: No signature of method: test.constructPath() is applicable for argument types: (groovy.json.internal.LazyMap) values: [[created:2014-06-04T00:21:55.149Z, created_by:jenkins, modified:2014-06-04T00:21:55.146Z, ...]]
Possible solutions: constructPath(java.util.HashMap)
        at test$_getAqlQueryResult_closure1.doCall(test.groovy:41)
        at test.getAqlQueryResult(test.groovy:40)
        at test$getAqlQueryResult.callCurrent(Unknown Source)
        at test.run(test.groovy:16)

AQL查詢結果。

{
"results" : [ {
  "repo" : "war-release",
  "path" : "webapp",
  "name" : "webapp-194-20140604002145-7c157a8afcd3e8fc6a9ecbbf0ec45153991ef23d.war",
  "type" : "file",
  "size" : 87411497,
  "created" : "2014-06-04T00:21:55.149Z",
  "created_by" : "jenkins",
  "modified" : "2014-06-04T00:21:55.146Z",
  "modified_by" : "jenkins",
  "updated" : "2014-06-04T00:21:55.146Z"
} ],
"range" : {
  "start_pos" : 0,
  "end_pos" : 1,
  "total" : 1
}
}

好吧,錯誤消息相對清晰。 您調用的方法constructPath()期望將HashMap作為參數,但是給它一個LazyMap ,這有所不同。 使您的方法constructPath()期望使用Map並且如果LazyMap實現Map ,它將起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM