web-dev-qa-db-ja.com

メソッドのシグネチャなし:Groovyの引数タイプエラーに適用可能

私はgroovyに非常に新しく、以下のメソッドを実行すると次のエラーが発生します。 XMLファイル名とマップを渡そうとしています

RD.groovy

    Given(~'^input currency "([^"]*)"$') { String baseCurr ->
     fromCurr = baseCurr
}
When(~'^insert end Currency "([^"]*)"$') { String tragetCurr ->
     toCurr = tragetCurr
}


Then(~'^get the expected end currency value "([^"]*)"$') { String result ->

    assert result == currCon(fromCurr, toCurr)


}

private currCon(fromCurr, toCurr)
{

    def binding = ["fromCurr": fromCurr, "toCurr": toCurr]
    response = Consumer.currConvert("request/CurrencyConvert.xml",binding)    --> This is line 119

    assert 200 == response.status
    return response.data.ConversionRateResult.toString()
}

ClassA.groovy

    package abc.api.member

import abc.util.Log
import abc.util.TemplateUtil
import groovyx.net.http.ContentType
import abc.api.RestClient


class ClassA extends ClassB{

    ClassA(RestClient restClient) {
        super(restClient)
    }

def currConvert(String xmlFilename, Map binding) {

        return currencyConvertRequest(TemplateUtil.xmlFromTemplate(xmlFilename, binding))

    }

def currencyConvertRequest(xmlString) {

        def params = [path : 'CurrencyConvertor.asmx',
                headers: globeHeaders(),
                body: xmlString]
        return restClient.post(params)
    }

Consumer.Groovy

package abc.api.member

import geb.Browser
import org.Apache.http.client.utils.URIBuilder
import abc.api.RestClient
import abc.browser.member.Admin


class Consumer {
    Browser browser
    String token
    String userId

    @Delegate
    private ClassA classA

 Consumer(url) {
        browser = new Browser()
        browser.baseUrl = baseUrl(url)
        restClient = new RestClient(url)

        classA =  new ClassA(restClient)    
    }

private baseUrl(url) {
        URI uri = URI.create(url)
        URIBuilder builder = new URIBuilder()
        URI result =builder.setHost(uri.Host). //
                setPath(uri.path). //
                setPort(uri.port). //
                setScheme(uri.scheme). 
                setUserInfo("Cons", "pbiCons").build()

        return result.toURL().toString()
    }

エラー:

groovy.lang.MissingMethodException: No signature of method: abc.api.consumer.Consumer.currConvert() is applicable for argument types: (org.codehaus.groovy.runtime.GStringImpl, Java.util.LinkedHashMap) values: [request/globe/CurrencyConvert.xml, [fromCurr:AUD, ...]]
            at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.Java:55)
            at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.Java:51)
            at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.Java:45)
            at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.Java:108)
            at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.Java:120)
            at RD.currCon(RD.groovy:119)

問題を検索した後、それは一般的な問題であることが判明しました。しかし、理解できませんでした。すべてのソリューションは主観的なものだからです。

私が間違っているところに興味があります

ありがとう

8
SMPH

currConvertはインスタンスメソッドですが、静的メソッドであるかのように呼び出されています。

8

私はこのような同様の問題がありました:

class Example {
  static void main (String [] args) {
   printMessage(obj)
  }
  def printMessage(obj) {
  }
}

PrintMessage(obj)で同じ例外が発生していました。次のように変更すると修正されました。

class Example {
  static void main (String [] args) {
    new Example().printMessage(obj)
   }
   def printMessage(obj) {
   }
 }
1