2016-07-27 2 views
4

Supposons que j'ai une classe de cas scala avec la possibilité de sérialiser en JSON (en utilisant json4s ou une autre bibliothèque):Case Classe instanciation De Typesafe Config

case class Weather(zip : String, temp : Double, isRaining : Boolean) 

Si j'utilise un fichier de configuration HOCON:

allWeather { 

    BeverlyHills { 
    zip : 90210 
    temp : 75.0 
    isRaining : false 
    } 

    Cambridge { 
    zip : 10013 
    temp : 32.0 
    isRainging : true 
    } 

} 

Est-il possible d'utiliser typesafe config instancier automatiquement un objet Weather?

Je cherche quelque chose de la forme

val config : Config = ConfigFactory.parseFile(new java.io.File("weather.conf")) 

val bevHills : Weather = config.getObject("allWeather.BeverlyHills").as[Weather] 

La solution pourrait tirer parti du fait que la valeur référencée par "allWeather.BeverlyHills" est un JSON « blob ».

Je ne pouvais évidemment écrire mon propre analyseur:

def configToWeather(config : Config) = 
    Weather(config.getString("zip"), 
      config.getDouble("temp"), 
      config.getBoolean("isRaining")) 

val bevHills = configToWeather(config.getConfig("allWeather.BeverlyHills")) 

Mais cela semble inélégant puisque toute modification de la définition météo nécessiterait également un changement de configToWeather.

Merci d'avance pour votre commentaire et votre réponse.

Répondre

8

La bibliothèque de configuration typesafe a API to instantiate objet de config qui utilise la convention java bean. Mais si je comprends bien la classe de cas ne suit pas ces règles.

several scala libraries Il y a several scala libraries qui enveloppe la configuration de typesafe et fournit les fonctionnalités spécifiques à scala que vous recherchez.

Par exemple en utilisant pureconfig config de lecture pourrait ressembler à

val weather:Try[Weather] = loadConfig[Weather] 

Weather est une classe de cas pour les valeurs dans la configuration

+0

+1 pour pureconfig. Vous connaissez l'excellent [configuration management] de Spring Boot (https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html), pureconfig est la chose la plus proche Je pourrais trouver à Scala. –

5

expansion sur la réponse de Nazarii, ce qui suit a fonctionné pour moi:

import scala.beans.BeanProperty 

//The @BeanProperty and var are both necessary 
case class Weather(@BeanProperty var zip : String, 
        @BeanProperty var temp : Double, 
        @BeanProperty var isRaining : Boolean) { 

    //needed by configfactory to conform to java bean standard 
    def this() = this("", 0.0, false) 
} 

import com.typesafe.config.ConfigFactory 

val config = ConfigFactory.parseFile(new java.io.File("allWeather.conf")) 

import com.typesafe.config.ConfigBeanFactory 

val bevHills = 
    ConfigBeanFactory.create(config.getConfig("allWeather.BeverlyHills"), classOf[Weather]) 
+1

Notez que les trois constructeurs sans argument, '@ BeanPropery' et' var' sont requis pour faire ce travail. Si vous oubliez 'var', vous obtiendrez une valeur vide (assignée dans le constructeur) au lieu de celle configurée. –

+0

@StefanL Mise à jour en conséquence, merci. –