我有以下Groovy类:
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%肯定是在这个问题之外并且由于完整(非常大)代码的连接方式而被编码。
我的问题是Guice和/或Groovy找不到LocalEndpoint
的{{1}}和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
注释或一些东西。有什么想法吗?
答案 0 :(得分:3)
我认为您需要在TupleConstructor
注释中添加includeSuperProperties
,这似乎可以解决它,即使它本身也是如此:
@TupleConstructor(includeSuperProperties=true)
所以整个事情就是:
@Canonical
abstract class Endpoint {
String name
Protocol protocol
}
@Canonical // You may not need this anymore
@TupleConstructor(includeSuperProperties=true)
class LocalEndpoint extends Endpoint {
}