【问题标题】:Groovy could not find matching constructor?Groovy 找不到匹配的构造函数?
【发布时间】:2014-08-20 15:24:43
【问题描述】:

请注意:虽然这个问题提到了 Mongo,但它肯定是一个纯粹的 Groovy 问题。

我的MyApp#bootstrap 方法:

def bootstrap(AppConfiguration config) {
    String h = config.dbHost
    String p = config.dbPort

    println "Mongo is at: ${h}:${p}."

    dao = new MongoDao(host: h, port: p)
}

我的MongoDao 班级(sn-p):

class MongoDao implements BasicDao {
    String dbName
    Mongo mongo
    String host
    String port
    Morphia morphia
    Datastore datastore

    MongoDao(String host, String port) {
        this.dbName = "db_myapp"
        this.mongo = new Mongo(host, port)
        this.morphia = new Morphia()
        this.datastore = morphia.createDatastore(mongo, dbName)

        morphia.mapPackage("myappdb.common")
    }
}

当这个bootstrap() 方法运行时,我得到以下异常:

Mongo is at: mymongo01:27017.
Exception in thread "main" groovy.lang.GroovyRuntimeException: Could not find matching constructor for: com.me.myapp.dao.MongoDao(java.util.LinkedHashMap)
    at groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1601)
    at groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1404)
    at org.codehaus.groovy.runtime.callsite.MetaClassConstructorSite.callConstructor(MetaClassConstructorSite.java:46)

这里发生了什么?主机/端口是如何被读入并打印到 STDOUT 的,但是当我们构建 DAO 时,它们神奇地变成了LinkedHashMap

【问题讨论】:

    标签: mongodb syntax groovy runtimeexception morphia


    【解决方案1】:

    如果你想用命名参数调用构造函数,你的类还必须提供一个无参数构造函数。

    在您的情况下,我会拨打以下电话:

    dao = new MongoDao( h, p )
    

    因为这个构造函数正在做一些工作

    【讨论】:

    • 经典 Groovy “gotchya”。当我允许时,我会给你一张绿色支票。谢谢!
    • @Zac 我相信我们中的许多人来自例如python 背景会觉得这很奇怪:new Cls(x:1, y:2) 不通过命名参数调用(例如 python somefunc(x,y=1,a=6)),而是new Cls([x:1, y:2]) 的缩写(所以这是一个映射),它将使用ctor() 构造并调用设置器/使用给定的地图设置属性。
    猜你喜欢
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 2016-01-26
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多