typesafe的配置是否支持自定义转换器?

时间:2014-03-28 16:31:30

标签: java guice typesafe-config

上下文

我想使用Guice自动注入配置项。我的配置框架是typesafe"配置。

public class MyObject {
  @Configuration("value") int value;
}

为此,我写了一个注释。

// Annotations skipped, but correct
public @interface Configuration {
  String value();
}

我写了一个模块。该模块检查要注入的所有类型,然后允许注入本身。

public class ConfigurationModule extends AbstractModule {
  @Override protected void configure() {
    final Config config = ConfigFactory.load();
    class ConfigurationMembersInjector<T> implements MembersInjector<T> {
      private final Field field;
      ConfigurationMembersInjector(Field field) {
        this.field = field;
        field.setAccessible(true);
      }
      @Override public void injectMembers(T t) {
        try {
          String key = field.getAnnotation(Configuration.class).value();
          field.set(t, config.getXxxx()); // what to write?
        } catch (IllegalAccessException e) {
          throw new RuntimeException(e);
        }
      }
    }
    class ConfigurationTypeListener implements TypeListener {
      @Override public <T> void hear(TypeLiteral<T> typeLiteral, TypeEncounter<T> typeEncounter) {
        for (Field field : typeLiteral.getRawType().getDeclaredFields()) {
          if (field.isAnnotationPresent(Configuration.class)) {
            typeEncounter.register(new ConfigurationMembersInjector<T>(field));
          }
        }
      }
    }
    bindListener(Matchers.any(), new ConfigurationTypeListener());
  }
}

问题

如何自动将配置项转换为特定但未知的类型?有没有办法说&#34;我希望这个项目转换为这种类型&#34;?还有,有办法注册&#34;定制转换器?

否则,我是否必须编写自己的转换机制?

2 个答案:

答案 0 :(得分:1)

从1.3.0版(2015年4月16日发布)开始,存在ConfigBeanFactory,这与我的要求最接近。对我的项目来说有点晚了,但碰巧做了这个伎俩。

答案 1 :(得分:0)

您尝试做的另一种替代方法是使用Classpath scanner扫描您的自定义注释(我假设是Binding Annotation),然后将您的配置值绑定到那些用这些注释注释的类型。

这是我开发库时的确切方法:Typesafe Config Guice,它将Typesafe Config文件中的配置值绑定到带注释的参数和字段。