2014-03-28 61 views
2

上下文

我想使用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()); 
    } 
} 

问题

如何自动的配置项转换为特定的未知类型?有没有办法说“我想这个项目转换为这种类型”?另外,有没有办法“注册”自定义转换器?

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

回答

1

从版本1.3.0(2015年4月16日发布)开始,存在一个ConfigBeanFactory,这与我所问的最接近。我的项目有点晚了,但碰巧做到了。

+0

它支持将嵌套配置绑定到嵌套的java对象吗? – user1870400

+0

@ user1870400是的,如果这些对象遵循一些简化的JavaBeans约定:no-arg构造函数;公共setter和getter为每个属性,或者属性是'Config.getXXX()'方法支持的类型。这意味着属性的声明类型必须是要实例化的具体类型。 – erickson

0

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

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

+1

这并不回答基本问题:“类型安全的配置是否支持自定义转换器?” –