2013-06-19 1 views
14

Hocon formatconf/application.conf의 구성을 사용하는 Play 애플리케이션 (2.1)을 만들었습니다.Hocon : 구성 파일에서 객체 배열을 읽습니다.

구성에 프로젝트 배열을 추가하고 싶습니다. 파일 conf/application.conf은 다음과 같습니다

... 
projects = [ 
    {name: "SO", url: "http://stackoverflow.com/"}, 
    {name: "google", url: "http://google.com"} 
] 

내가 내 스칼라 프로젝트에서이 구성을 읽으려고 :

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 파일을 사용해야합니까?

답변

8

나를 위해 다음 작품 재생 2.1.2 (그래도 난 내 play.Play 객체의 .maybeApplication이 없어, 나는 당신이 왜 확실하지 않다) :

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) 

주기 출력 :

를 내가 (다시 API는 다른 당신이 갖고있는 것 같다) 중 하나 Option 인스턴스의 전체를 많이 손실되지 않지만
List(Project(SO,http://stackoverflow.com/), Project(google,http://google.com)) 

, 훨씬 차이가있다. 당신이 대신 캐스트 또는 .toString() 호출하는 의지의 검색에 유형을 지정할 수있는 List[play.Configuration]를 반환하기 때문에

더 중요한 것은, getConfigList, 당신이 원하는 무엇을위한보다 적절한 것으로 보인다.

+0

감사합니다. 훨씬 쉬워 보입니다. Play 2.1.2로 몇 주 (... holidays ...)에 답변을 확인하겠습니다. – Sonson123

1

배열의 내용이 Json이고 대소 문자 클래스가 있다고 가정하면 Json Play API을 사용하고 그런 식으로 개체를 사용할 수 있습니다. Inception 부분은 사소한 것이어야합니다.

+0

는 예, JSON 파일을 구문 분석 Hocon을 분석하는 것보다 훨씬 쉬울 것 같다 (2.4+ 사출 재생을 사용). 이것은 해결책 일 것이지만, 나는 Json보다 Hocon을 제공하는 장점을 잃어버린다. Json Play Api와 같은 Hocon-Parser-API는 멋지다. – Sonson123

2

이 부분은 무엇입니까? y.toList.map{z =>? 당신이 결과로 Project의 컬렉션을 원하는 경우, 왜는 수행이 경우

val simpleConfig = x.configration.getObjectList("projects").map{y => 
    Project(y.get("name").toString, y.get("url").toString) 
} 

map 작업은 y이 무엇 ConfigObject의 인스턴스를 복용해야합니다. 그게 당신이 Project 인스턴스를 얻는 데 필요한 것 같아요, 그래서 난 왜 toListConfigObject (어느 Map입니다) Tuple2 목록에 넣고 그 다음 다시 추가 매핑.

+1

'getObjectList'는'Option [java.util.List [_ <: ConfigObject]]'를 ​​반환하므로'y'는 java.util입니다.목록 [_ <: ConfigObject>'. 또 다른 것 :'y.get ("name"). toString'은 f.ex입니다. 'ConfigString ("google")', 원시 값을 얻는 방법을 모르겠습니다. 객체 배열을 읽는 것은 매우 복잡해 보입니다. 더 쉬운 방법이 있어야할까요? – Sonson123

2

strangefeatures에 다음과 같은 일반 HOCON 구성이 작동 대답하면

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 

관련 문제