Configuration 递归地将配置绑定到guice中的名称

Configuration 递归地将配置绑定到guice中的名称,configuration,jackson,guice,dropwizard,Configuration,Jackson,Guice,Dropwizard,我的应用程序具有使用Jackson的fasterxml注释将解析注释加载到文件中的配置。例如: public class RootConfiguration extends Configuration { @JsonProperty @NotEmpty public String foo; @JsonProperty public BarConfiguration bar; public class BarConfiguration extends Configur

我的应用程序具有使用Jackson的fasterxml注释将解析注释加载到文件中的配置。例如:

public class RootConfiguration extends Configuration {

  @JsonProperty
  @NotEmpty
  public String foo;

  @JsonProperty
  public BarConfiguration bar;

  public class BarConfiguration extends Configuration {
    @JsonProperty
    public String baz;      
  }
}
然后将配置注入my
模块中的提供程序中,这些提供程序帮助我将这些属性绑定到代码中使用它们的位置。像这样:

  @Provides
  @Named("config")
  public RootConfiguration provideRootConfiguration(RootConfiguration configuration) {
    return configuration;
  }

  @Provides
  @Named("config.foo")
  public String provideFooConfiguration(RootConfiguration configuration) {
    return configuration.foo;
  }

  @Provides
  @Named("config.bar")
  public BarConfiguration provideBarConfiguration(RootConfiguration configuration) {
    return configuration.bar;
  }
等等

我正在寻找一个框架来帮助我避免这项繁琐的工作

我会想象这样的事情:

@Configuration(value = "config", bindSubProperties = true)
public class RootConfiguration extends Configuration {
...
这将使用反射将类中的任何子字段绑定为guice
Names
。 我已经研究了
Governator
的配置注释,但据我所知,它们需要应用于我要绑定的每个配置,这为我节省了一些编码,但本质上是相同的(我仍然必须手动指定我要绑定的每个配置的路径)

在我推出自己的实现之前,有什么东西可以满足我的需要吗


注意:我将此用于一个
Dropwizard
项目,因此使用Jackson将配置映射到POJO的限制非常严格(除非我将应用程序配置移到配置yaml之外)。

我不知道有任何工具可以为您这样做,但是你可以用这样的方法很容易地做到:

@Configuration(value = "config", bindSubProperties = true)
public class RootConfiguration extends Configuration {
...
void bindConfiguration(){
for(字段:RootConfiguration.class.getFields(){
bindConfiguration(TypeLiteral.get(field.getGenericType()),field);
}
}
void bindConfiguration(TypeLiteral类型,字段){
绑定(类型)
.annotatedWith(Names.named(“config.+field.getName()))
.toProvider(新配置提供程序(字段))
.在(独生子女班);
}
类ConfigurationProvider实现提供程序{
私人终场;
@注入根配置;
ConfigurationProvider(字段){
this.field=字段;
}
@凌驾
公共部门得不到{
返回(T)字段。获取(配置);
}
}