2017-03-20 7 views
1

私は文字列から設定を解析するときに置換を解決できますが、マップやファイルから解析するときは置き換えられません。タイプセーフな設定 - map/fileから解析して解決する

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}"})) 

をライブラリがそれを処理するようにしますか?

+0

多かれ少なかれ同様の説明をして、同じことを尋ねることを、ライブラリの[Githubのページ](https://github.com/typesafehub/config/issues/76)上の問題があります以下のフェデリコの答えに。 –

答えて

3

fromAnyRefからConfigFactory.parseMap方法鉛、私たちのために関連する部分は次のとおりです。

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

それはConfigReferenceとして値を解析することはありませんので、resolveは仕事ができる方法はありません。

データ構造を「制御する」とすれば、どういうわけかスカラ文字列の補間を利用することができます。


parseFileについては、状況がより簡単です。 Javaプロパティファイルが${}の置換をサポートしていない場合、ファイルの種類はファイル拡張子(.properties)で推測されます。

HOCONなどの形式を使用することができます。ファイルの名前を変更するだけで(test.conf)、${}の置換はすぐに機能するはずです。ここ

詳細情報:HOCON

関連する問題