Configuration 递归地将配置绑定到guice中的名称
我的应用程序具有使用Jackson的fasterxml注释将解析注释加载到文件中的配置。例如: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
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 {
...
这将使用反射将类中的任何子字段绑定为guiceNames
。
我已经研究了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)字段。获取(配置);
}
}