2014-03-28 3 views
2

컨텍스트

Guice를 사용하여 구성 항목을 자동으로 주입하고 싶습니다. 내 구성 프레임 워크는 typesafe의 구성입니다.typesafe의 config는 사용자 지정 변환기를 지원합니까?

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 생성자; 각 프로퍼티에 대한 public setter와 getter이거나, 프로퍼티는'Config.getXXX()'메소드에 의해 지원되는 타입이다. 즉, 선언 된 유형의 특성은 인스턴스화 할 구체 유형이어야합니다. – erickson

0

당신이하려는 또 다른 방법은 Classpath scanner을 사용하여 사용자 정의 주석 (Binding Annotation이라고 가정)을 스캔 한 다음 구성 값을 해당 주석으로 주석 된 유형에 바인딩하는 것입니다.

내 라이브러리를 개발하는 것과 정확히 같은 접근 방식입니다. 은 Typesafe Config 파일의 구성 값을 주석 된 매개 변수와 필드에 바인딩합니다.

+1

기본 질문에 대한 답변이 없습니다. "typesafe의 설정이 사용자 지정 변환기를 지원합니까?" –

관련 문제