我有以下的Groovy類:吉斯,Groovy中,@Canonical和繼承沒有很好地一起玩
enum Protocol {
File,
Ftp,
Sftp,
Http,
Https
}
@Canonical
abstract class Endpoint {
String name
Protocol protocol
}
@Canonical
@TupleConstructor(includeFields=true, includeSuperFields=true)
class LocalEndpoint extends Endpoint {
}
class MyAppModule extends AbstractModule {
@Override
protected void configure() {
// Lots of stuff...
}
// Lots of other custom providers
@Provides
Endpoint providesEndpoint() {
new LocalEndpoint('fileystem', Protocol.File)
}
}
不要擔心,爲什麼我使用的Endpoint
,而不是隻自定義提供:
bind(Endpoint).toInstance(new LocalEndpoint('fileystem', Protocol.File))
我99.999%肯定這是超出這個問題,並編碼的方式,因爲如何完整(非常大)的代碼連線。
我的問題是,吉斯和/或Groovy找不到LocalEndpoint
一個構造函數一個String
和Protocol
說法:
1) Error in custom provider, groovy.lang.GroovyRuntimeException: Could not find matching constructor for: com.example.myapp.model.LocalEndpoint(java.lang.String, com.example.myapp.model.Protocol)
at com.example.myapp.inject.MyAppModule.providesEndpoint(MyAppModule.groovy:130)
while locating com.example.myapp.model.Endpoint
for parameter 2 at com.example.myapp.inject.MyAppModule.providesConfig(MyAppModule.groovy:98)
at com.example.myapp.inject.MyAppModule.providesConfig(MyAppModule.groovy:98)
while locating com.example.myapp.config.MyAppConfig
然後吐出來跟下面列出的原因大堆棧跟蹤:
Caused by: groovy.lang.GroovyRuntimeException: Could not find matching constructor for: com.example.myapp.model.LocalEndpoint(java.lang.String, com.example.myapp.model.Protocol)
at groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1731)
at groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1534)
但願這東西,我可以通過修改Endpoint
和/或LocalEndpoint
調整,也許我需要一些特殊的參數傳遞到@Canonical
/@TupleConstructor
註釋什麼的。有任何想法嗎?
資格參數在構造函數new LocalEndpoint(name:'fileystem',protocol:Protocol.File) –
謝謝@ToddWCrone(+1)但我不喜歡Groovy映射構造函數。感謝'@ Canonical','@ TupleConstructor'等等,我應該能夠使用普通的「Java風格」構造函數調用。任何建議如何獲得這個工作無效的地圖構造函數?再次感謝! – smeeb
合格的參數名稱更好。我不會花費很多精力去嘗試讓更模糊的構造函數工作。抱歉。 –