Hocon形式 のconf/application.conf
の構成を使用するPlayアプリケーション(2.1)を作成しました。
構成にプロジェクトの配列を追加したいと思います。ファイルconf/application.conf
は次のようになります。
...
projects = [
{name: "SO", url: "http://stackoverflow.com/"},
{name: "google", url: "http://google.com"}
]
私は自分のScalaプロジェクトでこの構成を読み取ろうとしています:
import scala.collection.JavaConversions._
case class Project(name: String, url: String)
val projectList: List[Project] =
Play.maybeApplication.map{x =>
val simpleConfig = x.configration.getObjectList("projects").map{y =>
y.toList.map{z =>
Project(z.get("name").toString, z.get("url").toString) // ?!? doesn't work
...
}}}}}}}} // *arg*
このアプローチは非常に複雑なようで、私は多くのOptions
で迷子になり、Eclipse IDEはクラスについてのヒントを私に与えることができません。
Hocon構成ファイルからオブジェクトの配列を読み取る方法の例はありますか?または、これにHoconの代わりにJSONパーサーを使用したJSONファイルを使用する必要がありますか?
Play 2.1.2では、次のように機能します(ただし、.maybeApplication
オブジェクトにplay.Play
がないので、なぜそうするのかわかりません)。
import play.Play
import scala.collection.JavaConversions._
case class Project(name: String, url: String)
val projectList: List[Project] = {
val projs = Play.application.configuration.getConfigList("projects") map { p =>
Project(p.getString("name"), p.getString("url")) }
projs.toList
}
println(projectList)
出力を与える:
List(Project(SO,http://stackoverflow.com/), Project(google,http://google.com))
Option
インスタンスの多くで迷子になることはありませんが、それほど大きな違いはありません(ここでも、お持ちのAPIとは異なります)。
さらに重要なことに、getConfigList
はList[play.Configuration]
を返すため、実行したいことにより近いように見えます。これにより、キャストや.toString()
に頼るのではなく、取得時に型を指定できます。呼び出します。
通常のHOCON構成の場合、strangefeaturesと同様に、これは機能します
import javax.inject._
import play.api.Configuration
trait Barfoo {
def configuration: Configuration
def projects = for {
projectsFound <- configuration.getConfigList("projects").toList
projectConfig <- projectsFound
name <- projectConfig.getString("name").toList
url <- projectConfig.getString("url").toList
} yield Project(name,url)
}
class Foobar @Inject() (val configuration: Configuration) extends Barfoo
(Play 2.4+インジェクションを使用)
この部分y.toList.map{z =>
で何を達成しようとしていますか?結果としてProject
のコレクションが必要な場合は、次のようにしてください。
val simpleConfig = x.configration.getObjectList("projects").map{y =>
Project(y.get("name").toString, y.get("url").toString)
}
この場合、map
操作はConfigObject
のインスタンスを取得する必要があります。これはy
です。 Project
インスタンスを取得するために必要なのはそれだけのようです。そのため、なぜあなたがtoList
(ConfigObject
)をMap
しているのかわかりません。 )Tuple2
のリストに追加し、さらにそれを再度マッピングします。
配列の内容がJsonであり、ケースクラスがある場合、 Json Play API を使用して、そのようにオブジェクトを操作することができます。 Inception の部分はそれを些細なものにするはずです。