简体   繁体   中英

MissingMethodException in groovy scripting

I'm new to the groovy scripting. I'm running script on remote box. using the jfrog delete artifacts script as usual( https://www.jfrog.com/blog/advanced-cleanup-using-artifactory-query-language-aql/ ). updated the host per my requirement.but when ever run the command I'm getting missing method exception.

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")
        }
    }
}

Exception

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 query result.

{
"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
}
}

Well, the error message is relatively clear. You call a method constructPath() that expects a HashMap as argument, but give it a LazyMap which is something different. Make your method constructPath() expect a Map and it will work if LazyMap implements Map .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM