首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归地将配置绑定到guice中的名称

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

Stack Overflow用户
提问于 2015-05-19 02:05:15
回答 1查看 188关注 0票数 1

我的应用程序有一些配置,这些配置是通过解析注释加载到使用Jackson的fasterxml注释的文件中的。例如:

代码语言:javascript
复制
public class RootConfiguration extends Configuration {

  @JsonProperty
  @NotEmpty
  public String foo;

  @JsonProperty
  public BarConfiguration bar;

  public class BarConfiguration extends Configuration {
    @JsonProperty
    public String baz;      
  }
}

然后,配置被注入到我的Module中的提供程序中,它帮助我将这些属性绑定到代码中使用它们的位置。如下所示:

代码语言:javascript
复制
  @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;
  }

诸若此类。

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

我会想像下面这样的东西:

代码语言:javascript
复制
@Configuration(value = "config", bindSubProperties = true)
public class RootConfiguration extends Configuration {
...

这将使用反射将我的类中的任何子字段绑定为guice Names。我研究了Governator的配置注释,但就我所能看到的,它们需要应用于我想要绑定的每个配置,这节省了我一些代码,但本质上是相同的(我仍然必须手动指定我想要绑定的每个配置的路径)。

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

注意:我在一个Dropwizard项目中使用它,所以使用Jackson将配置映射到POJO的限制相当严格(除非我将应用程序配置移到config yaml之外)。

EN

回答 1

Stack Overflow用户

发布于 2015-05-20 00:01:17

我不知道有什么工具可以帮你做到这一点,但你可以很容易地用下面这样的东西自己做:

代码语言:javascript
复制
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);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30310055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档