Play Framework: Combining multiple global objects in a multi-module project

I am creating a multi-module project using Play 2.3 and Java 8. The root application, and each module has a Global object. But as we know, Play uses only one global object from the root application.

Simplified folder structure:

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

All global classes placed in an unnamed package.

I use this method to merge global objects from subprojects:

1) Declared configuration variable in the root application application.conf

subprojects.with.globals="subprojectName1, subprojectName2, subprojectName3, ..."

2) Added a private field and private method to the root directory of Global.java

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

private void LoadSubprojectGlobals(Application app)
    throws ClassNotFoundException, IllegalAccessException, InstantiationException
{
    String subprojectNames = 
        app.configuration().getString("subprojects.with.globals");
    if (!subprojectNames.isEmpty())
    {
        Class subprojectGlobalClass = null;
        for (String subprojectName : subprojectNames.split(","))
        {
            subprojectGlobalClass = Class.forName(
                WordUtils.capitalize(subprojectName.trim().toLowerCase()) +
                "Global"
            );
            subprojectGlobals.add(
                (GlobalSettings)subprojectGlobalClass.newInstance()
            );
        }
    }
}

3) I placed this code in the onStart event handler in the Global.java root folder

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

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

, , subprojects.with.globals application.conf. , Global.java.

, java- root onStart. ? root build.sbt Application?

UPDATE

, @Mon Calamari.

1) subprojects.with.globals root application.conf.

2) :

/subprojects
    /user
        /app
            /globals
                UserGlobal.java
    /admin
        /app
            /globals
                AdminGlobal.java

3) ​​ subproject conf,

application.global= globals.UserGlobal

4) LoadSubprojectGlobals():

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
1

, /, , org.reflections play.GlobalSettings:

Reflections reflections = new Reflections("your.package");    
Set<Class<? extends GlobalSettings>> classes = reflections.getSubTypesOf(GlobalSettings.class)
+1

All Articles