简体   繁体   中英

Play Framework 2.3.8 Java - Overriding default configuration load with mode specific

I want to implement a mode specific configuration load in Play Framework 2.3.8 using Java. I know that this is achievable in Scala:

import java.io.File
import play.api._
import com.typesafe.config.ConfigFactory

object Global extends GlobalSettings {
  override def onLoadConfig(config: Configuration, path: File, classloader: ClassLoader, mode: Mode.Mode): Configuration = {
    val modeSpecificConfig = config ++ Configuration(ConfigFactory.load(s"application.${mode.toString.toLowerCase}.conf"))
    super.onLoadConfig(modeSpecificConfig, path, classloader, mode)
  }
}

Currently I managed to implement the same in java but I cannot cast the typesafe-s ConfigFactory.load(modeSpecificConfigFile) return object from com.typesafe.config.Config to play.Configuration :

 @Override
    public Configuration onLoadConfig(Configuration configuration, File file, ClassLoader classLoader, Mode mode) {
        String modeSpecificConfigFile = "application." + mode.toString().toLowerCase() + ".conf";
        Logger.debug("Loading mode specific configuration from: " + modeSpecificConfigFile);
        Configuration modeSpecificConfig = ConfigFactory.load(modeSpecificConfigFile);
        return super.onLoadConfig(modeSpecificConfig , file, classLoader);
    }

Thank you!

将其包装为play.Configuration

Configuration modeSpecificConfig = new play.Configuration(ConfigFactory.load(modeSpecificConfigFile)); 

This solution doesn't work in Play 2.4.6 , because as it says in docs :
onLoadConfig Deprecated. This method does not do anything. Instead, specify configuration in your config file or make your own ApplicationLoader (see GuiceApplicationBuilder.loadConfig).

Thus I've implemented a simpler alternative solution , a custom Configuration loader, sharing sample code below.

First, assuming you already have all your parameters in "application.conf"
then create "application.prod.conf" for PROD environment
and (optionally) create "application.dev.conf" for DEV environment

Sample application.prod.conf

# include the main config file, aka make all common params usable  
include "application.conf"  

# PROD specific params, you can also override params from the included conf  
param.for.prod.1 = "etc etc"  
here.override.for.prod = "blabla"  

usable across your app : ConfigManager.java

public class ConfigManager {
    public static play.Configuration modeSpecificConfig = new play.Configuration(
        ConfigFactory.load(
            "application." + Play.mode().toString().toLowerCase() + ".conf"
            )
        );
}

Now environment specific params are accessible across your app, you can get any param by using ConfigManager, for example:

ConfigManager.modeSpecificConfig.getString("keyname");  
ConfigManager.modeSpecificConfig.getInt("keyname2");  

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM