我的应用程序有一些配置是通过解析注释加载到使用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;
}
}
配置然后被注入到我的Module
中的提供者中,帮助我将这些属性绑定到使用它们的代码中的位置。像这样:
@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 {
...
将使用反射来绑定我的类中的任何子字段作为向导Names
。我已经研究了Governator
的配置注释,但据我所见,它们需要应用于我想要绑定的每个配置,这节省了我一些编码,但本质上是相同的(我仍然需要手动指定每个配置的路径,我想要绑定)。
在我推出自己的实现之前,是否有什么东西可以满足我的需要?
注意:我将此用于Dropwizard
项目,因此使用Jackson将配置映射到pojo的约束相当严格(除非我将应用程序配置移到配置yaml之外)。
我不知道有什么工具能帮你做到这一点,但你自己也可以很容易地做到,像这样:
void bindConfiguration() {
for (Field field : RootConfiguration.class.getFields() {
bindConfiguration(TypeLiteral.get(field.getGenericType()), field);
}
}
<T> void bindConfiguration(TypeLiteral<T> type, Field field) {
bind(type)
.annotatedWith(Names.named("config." + field.getName()))
.toProvider(new ConfigurationProvider<T>(field))
.in(Singleton.class);
}
class ConfigurationProvider<T> implements Provider<T> {
private final Field field;
@Inject RootConfiguration configuration;
ConfigurationProvider(Field field) {
this.field = field;
}
@Override
public T get() {
return (T) field.get(configuration);
}
}