Guice,Groovy,@ Canon和继承不能很好地融合在一起

时间:2016-12-29 18:29:55

标签: groovy constructor guice

我有以下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注释或一些东西。有什么想法吗?

1 个答案:

答案 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 {
}