2013-06-19 9 views
14

Utworzyłem aplikację Play (2.1), która używa konfiguracji w conf/application.conf w Hocon format.Hocon: Odczytaj tablicę obiektów z pliku konfiguracyjnego

Chcę dodać tablicę projektów w konfiguracji. Plik conf/application.conf wygląda następująco:

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

próbie odczytania tej konfiguracji w moim projekcie 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* 

Takie podejście wydaje się być bardzo skomplikowane, jestem zgubiony w wielu Options i moje IDE Eclipse nie może dać mi żadnych wskazówek na temat klas.

Czy ktoś ma przykład, jak odczytać tablicę obiektów z pliku konfiguracyjnego Hocon? Czy powinienem użyć do tego pliku JSON z parserem JSON zamiast Hocon?

Odpowiedz

8

Poniższe działa na mnie w grze 2.1.2 (ja nie mam .maybeApplication na moim play.Play obiektu, choć i nie jestem pewien, dlaczego robisz):

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) 

Nadanie wyjście:

List(Project(SO,http://stackoverflow.com/), Project(google,http://google.com)) 

tam nie dużo różnych, choć nie zgubić się w całe mnóstwo Option przypadkach albo (znów różni się od API wydaje się mieć).

Co ważniejsze, getConfigList wydaje się być bliżej pasuje do tego, co chcesz zrobić, ponieważ zwraca List[play.Configuration], który pozwala określić typy na pobieranie zamiast uciekania się do odlewów lub .toString() połączeń.

+0

Dzięki, wygląda o wiele łatwiej. Sprawdzę tę odpowiedź za kilka tygodni (... wakacji ...) w Play 2.1.2. – Sonson123

1

Biorąc pod uwagę, że zawartość tablicy Json i masz klasę case, możesz spróbować użyć Json Play API i pracować z obiektami w ten sposób. Część Inception powinna być banalna.

+0

Tak, parsowania pliku JSON wydaje się być dużo łatwiejsze niż podczas analizowania Hocon. To byłoby rozwiązanie, ale straciłem zalety, które oferuje Hocon ponad Json. Hocon-Parser-API, taki jak Json Play Api byłby fajny. – Sonson123

2

Co próbujesz osiągnąć za pomocą tej części y.toList.map{z =>? Jeśli chcesz kolekcję Project w wyniku, to dlaczego nie po prostu zrobić:

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

W tym przypadku operacja map powinno być podejmowanie wystąpień ConfigObject która jest co y jest. Wydaje się, że to wszystko, czego potrzebujesz, aby uzyskać instancje Project, więc nie jestem pewien, dlaczego jesteś toList, który to ConfigObject (który jest Map) na listę Tuple2, a następnie ponownie mapowania, który jest ponownie.

+1

'getObjectList' zwraca' Option [java.util.List [_ <: ConfigObject]] ', więc' y' jest 'java.util.Lista [_ <: ConfigObject] '. Kolejna rzecz: 'y.get (" nazwa "). ToString' to f.ex. 'ConfigString (" google ")', nie wiem jak uzyskać z niego wartość nieprzetworzoną. Czytanie tablic obiektów wydaje się być tak skomplikowane, że musi być łatwiejszy sposób? – Sonson123

2

przypadku normalnej konfiguracji HOCON wtedy podobny do strangefeatures odpowiedzieć na to zadziała

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 

(Korzystanie Juz 2.4+ Injection)

Powiązane problemy