Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Play Framework: split routes in multiple files without sub projects

My play project is massive and the routes file is approx 1Mb. Now, when scala compiles, I have the exception "Method code too large" because of the routing and the reverse routing scala files created from my routes file(that are big too).

So, I need to split my routes file without subprojects. Indeed, I can't split my project into subprojects because its components are interdependent.

I tried 2 methods:

  • I added a new conf file called technical.routes, add some routes inside, remove the same routes from "routes", and import the file with "-> technical.Routes" Everything compiles, I don't have my previous exception, but something is wrong because when it stops compiling, it starts over and over... and never ends.

  • I added a new conf file called technical.routes, add some routes inside, remove the same routes from "routes", but instead of importing it in my main routes file, I added it in the conf file: "application.router="routes, technical.routes"". But it's not working because only one route must be declared here.

How to do, please?

like image 495
memainjm Avatar asked Nov 26 '13 08:11

memainjm


3 Answers

Well, the first method is working. I started from scratch and it worked. I did a clean command before the compile command. It seems that old compiled files were the cause of my problem.

Be careful to note that you cannot have an overlap in package names in the routes files. E.g. in this example, the technical.routes file contains all routes in the controllers.technical and the main routes file cannot contain any routes in the controllers.technical package.

conf/routes contents:

# Routes
# This file defines all application routes (Higher priority routes first)
# ~~~~

->  /technical technical.Routes

GET     /        controllers.Dashboard.index()

conf/technical.routes contents:

# Routes
# ~~~~

GET     /        controllers.technical.App.index()
like image 113
memainjm Avatar answered Nov 05 '22 16:11

memainjm


If your file name is technical.routes, while including the file, mention technical.Routes (caps).

The parameter after -> is the url prefix, so to access any url of technical.routes file, you need to add the prefix.

http://127.0.01/technical/{defined url in technical.routes file}

like image 3
Bidya Avatar answered Nov 05 '22 15:11

Bidya


None of the above info worked for me in play 2.8.x and macwire. Sharing the solution that worked for me.

If you are using a sbt single project and DI and still want to use multiple routes file, you can do so like below. No need of sbt multi project setup.

conf/ 
     routes
     admin.routes

conf/routes:

GET /index                  controllers.HomeController.index()

->  /admin admin.Routes

conf/admin.routes:

GET /index                  controllers.admin.HomeController.index()

And in the application loader, add below into build routes.

val adminRouter: admin.Routes = {
        val prefix = "/"
        wire[admin.Routes] //replace it with constructor if you do manual DI
}
val router: Routes = {
        val prefix = "/"
        wire[Routes] //replace it with constructor if you do manual DI
}

Tested with play 2.8.x and macwire.

like image 1
Seeni Avatar answered Nov 05 '22 15:11

Seeni