Play 2的多个全局设置

时间:2012-06-03 05:28:01

标签: java playframework-2.0

我可以为Play2设置两个全局设置对象吗?

我知道application.conf只提供了设置。

global=common.GlobalOne

两个全球类:

public class GlobalOne extends GlobalSettings {

  @Override
  public void onStart(Application app) {
      Logger.info("****** Set something ******");
  }

}

public class GlobalTwo extends GlobalSettings {

  @Override
  public void onStart(Application app) {
      Logger.info("****** some other ******");
  }

}

我要问的原因是玩2个模块。如何在模块中使用全局设置对象,以便在项目使用它时启用它?

4 个答案:

答案 0 :(得分:5)

那是不可能的。 GlobalSettings适用于应用程序,而不适用于模块。因此,模块不应定义GlobalSettings对象。

答案 1 :(得分:1)

我使用这种方法在root Global.java 中合并多个Global对象:

0)文件夹结构:

/root
    /app
        Global.java
    /conf
        application.conf
    /subprojects
        /user
            /app
                /globals
                    UserGlobal.java
        /admin
            /app
                /globals
                    AdminGlobal.java

1)将所有子项目Global类放入 globals 包中:

package globals;

public class UserGlobal extends GlobalSettings
{ ... }

2)将配置变量添加到所有子项目conf文件中,如

application.global= globals.UserGlobal

3)在root Global.java 中添加私有字段和私有方法:

private List<GlobalSettings> subprojectGlobals = new ArrayList<>();

private void LoadSubprojectGlobals(Application app)
    throws ClassNotFoundException, IllegalAccessException, InstantiationException
{
    Reflections reflections = new Reflections("globals");
    Set<Class<? extends GlobalSettings>> subprojectGlobalClasses = 
        reflections.getSubTypesOf(GlobalSettings.class);

    for(Class subprojectGlobalClass : subprojectGlobalClasses)
    {
        subprojectGlobals.add(
            (GlobalSettings)subprojectGlobalClass.newInstance()
        );
    }
}

4)将此类代码放入root Global.java 中的 onStart 事件处理程序中:

@Override
public void onStart(Application app)
{
    try
    {
        LoadSubprojectGlobals(app);
    }
    catch(Exception e)
    {
        new RuntimeException(e);
    }

    for(GlobalSettings subprojectGlobal: subprojectGlobals)
    {
        subprojectGlobal.onStart(app);
    }
}

现在,如果你添加一些新的子项目,你必须遵循一些关于添加Global类的约定,但是你不需要为合并功能修改任何东西。

如果要处理更多全局设置,则需要覆盖root Global.java 中的相应方法。

Here是关于此问题的问题。

答案 2 :(得分:0)

我的项目分为main->frontend->commonmain->backend->common依赖项。在每个(常见,前端和后端)中,我有一个GlobalSetting。我需要这个来运行测试。

答案 3 :(得分:0)

是的,这是不可能的,因为当你提出请求而不是播放框架引擎启动并且它找到当前应用程序的Global.java时,或者你可以说Action方法如果找不到它跳过那个。那么,bottomline是类名扩展GlobalSettings应该是Global.java