2017-03-20 7 views
1

문자열이나 문자열에서 구성을 파싱 할 때 대체를 해결할 수 있지만 맵이나 파일에서 파싱을 수행 할 때는 대체를 해결할 수 없습니다.타입 세이프 구성 - 맵/파일에서 구문 분석하고 해결합니다.

import java.io.File 
import com.typesafe.config.{Config, ConfigFactory} 
import scala.collection.JavaConversions.mapAsJavaMap 

val s: String = "a = test, b = another ${a}" 
val m: Map[String, String] = Map("a" -> "test", "b" -> "another ${a}") 
val f: File = new File("test.properties") // contains "a = test\nb = another ${a}" 

val cs: Config = ConfigFactory.parseString(s).resolve 
val cm: Config = ConfigFactory.parseMap(mapAsJavaMap(m)).resolve 
val cf: Config = ConfigFactory.parseFile(f).resolve 

println("b from string = " + cs.getString("b")) 
println("b from map = " + cm.getString("b")) 
println("b from file = " + cf.getString("b")) 

> b from string = another test 
> b from map = another ${a} 
> b from file = another ${a} 

나는 변수 자리가 정말 같은 방식으로 처리되지 않는 것을 볼 수있어 즉시 해결되지 않는 경우 :

val cs: Config = ConfigFactory.parseString(s) 
val cm: Config = ConfigFactory.parseMap(mapAsJavaMap(m)) 
val cf: Config = ConfigFactory.parseFile(f) 

> cs: com.typesafe.config.Config = Config(SimpleConfigObject({"a":"test","b":"another "${a}})) 
> cm: com.typesafe.config.Config = Config(SimpleConfigObject({"a":"test","b":"another ${a}"})) 
> cf: com.typesafe.config.Config = Config(SimpleConfigObject({"a":"test","b":"another ${a}"})) 

나는 어쩌면 그냥지도/문자열로 파일을 변환 할 수 있습니다,하지만 거기가 할 수있는 방법입니다 도서관이 그것을 처리하도록 만드시겠습니까?

if (object instanceof String) 
    return new ConfigString.Quoted(origin, (String) object); 

그것은 ConfigReference 같은 값을 구문 분석하지, 그래서 resolve이 일할 수있는 방법은 없습니다 :

+0

다소 비슷한 설명과 함께, 같은 요청 라이브러리의 [Github의 페이지]에 문제가 (https://github.com/typesafehub/config/issues/76)있다 아래 페데리코의 대답에. –

답변

3

fromAnyRefConfigFactory.parseMap 방법 리드, 우리를 위해 관련 부분이다.

데이터 구조를 "제어"하면 스칼라 문자열 보간을 활용할 수 있습니다.


parseFile의 경우 상황이 더 쉽습니다. Java 등록 정보 파일은 ${} 대체를 지원하지 않으므로 파일 유형은 (.properties) 파일 확장자로 추측됩니다.

예를 들어 HOCON 형식 만 사용할 수 있습니다. 즉, 파일 이름을 변경하면 (예 : test.conf) ${} 대체품을 즉시 사용할 수 있습니다.

여기

더 많은 정보 : HOCON