2013-06-24 2 views
2

Config 오브젝트를 해결하고 싶습니다. 예를 들어, config1config2라고 말하면됩니다.다른 하나와 타입 안전 구성 객체를 해결하십시오

정렬을 허용하는 유일한 공용 API는 config1.withFallback(config2).resolve()입니다. 그러나 이것은 우리가 원하는 어떤 것이 아닌 config2에서 config1으로 항목을 추가합니다.

일부 조사에서 ResolveContext이라는 비공개 클래스가 발견되어이를위한 방법을 제공합니다. 그래서 우리는 리플렉션을 사용하여 그것을 사용하고 있습니다. 현재 코드 :

object ConfigImplicits { 
    implicit class RichConfig(val config: Config) extends AnyVal { 
    def resolveWith(source: Config): Config = { 
     val resolver = resolveContext.getDeclaredMethod(
     "resolve", 
     abstractConfigValue, 
     abstractConfigObject, 
     configResolveOptions 
    ) 
     resolver.setAccessible(true) 
     resolver.invoke(
     null, 
     config.underlyingAbstractConfigObject, 
     source.underlyingAbstractConfigObject, 
     ConfigResolveOptions.defaults 
    ).asInstanceOf[ConfigObject].toConfig 
    } 

    def underlyingAbstractConfigObject = { 
     val f = simpleConfig.getDeclaredField("object") 
     f.setAccessible(true) 
     f.get(config) 
    } 
    } 

    val resolveContext = Class forName "com.typesafe.config.impl.ResolveContext" 
    val abstractConfigValue = Class forName "com.typesafe.config.impl.AbstractConfigValue" 
    val abstractConfigObject = Class forName "com.typesafe.config.impl.AbstractConfigObject" 
    val configResolveOptions = classOf[ConfigResolveOptions] 
    val simpleConfig = Class forName "com.typesafe.config.impl.SimpleConfig" 
} 

비공개 내부에 의존하는 것이 좋습니다. 따라서 :

  1. 우리가 어떻게 든 놓친 공개 방법이 있습니까? 이미이 방법이 있습니까?
  2. 그렇지 않다면 우리는 풀 요청을해야합니까?

답변

1

공개 메소드가 없습니다. 비공개 API를 사용하는 대신 덜 취약한 해결 방법은 대체 소스로 원본 개체를 사용하여 해결 한 다음 해결 한 원본 개체의 키를 반복하고 대상 개체에서 원하지 않는 키를 제거하는 것입니다.

Config.resolveWith()를 추가하지 않는 이유는 생각할 수 없습니다. 고려해 본 기억이 있기 때문에 이유가 있는지 궁금합니다. 아마 아무도 그걸 사용하지 않을 것이라고 생각했을거야.

끌어 오기 요청을하는 경우 테스트 및 문서를 포함해야합니다. 필자가 생각한 것처럼 매우 적은 코드로 추정된다면 풀 요청은 합리적이라고 생각합니다. 현재 마스터 브랜치는 API 추가를 위해 열려 있으며, 최종 1.2 릴리스에 나타납니다.

+0

일부 사회자가 자신의 권리를 남용하고 지난 번 게시 한 의견을 삭제 한 것으로 보입니다. 그 의사 소통을 적절하게 지속시키기 위해 나는 (내가 기억하는 바대로) 내가 게시 한 것을 반복 할 것이다 : "고맙다. 나는 성공할 경우, 포크로 찍어서 그 방법을 추가하고 시도하라." 약속대로, 나는 시도했지만, 계층 구조가 이상하게 얽힌 것 같은데, 나는 그 방법을 추가 할 수 없었다. [1/2] – missingfaktor

+0

원래 설정에 이미 해당 키가 있기 때문에 제안한 해결 방법이 작동하지 않았습니다. 우리는 그것들이 대체되기를 원치 않는다. 왜냐하면'withFallback'을 사용하는 대신에 우리는'reflectionWith' (리플렉션을 사용)를 썼다. – missingfaktor

+2

향후 방관자에게 resolveWith() API가 제공됩니다. –

관련 문제