Is there a way in Play to annotate routes to inform that a certain section/group routes is only available in dev or prod mode
2 Answers
Well, this is not documented, so I am not sure if this is intentionally possible or not, but I have found a way to make this work. Please note however, as this is an undocumented feature, may mean it is unintended, and therefore may break in future versions of play.
You are able to achieve what you want using the following line in your routes file.
%{ if (play.mode.isDev()) }%
I created a test application with a couple of actions
public class Application extends Controller {
public static void index() {
render();
}
public static void noDev() {
renderText("NoDev");
}
public static void noProd() {
renderText("NoProd");
}
}
I then added the following to my routes file
# Home page
GET / Application.index
# Ignore favicon requests
GET /favicon.ico 404
# Map static resources from the /app/public folder to the /public path
GET /public/ staticDir:public
%{ if (play.mode.isDev()) }%
GET /route1 Application.noDev
GET /route2 Application.noDev
GET /route3 Application.noDev
* /{controller}/{action} {controller}.{action}
%{ if (play.mode.isProd()) }%
GET /route4 Application.noProd
GET /route5 Application.noProd
GET /route6 Application.noProd
* /{controller}/{action} {controller}.{action}
So, you can see that using a simple if statement, it will execute the next group of routes only in that mode. The if statement will end when the next if statement is found.
If in Dev mode you try to access route4, you will not be able to access it, and you will see the RouteNotFound page showing that the available routes are those that you have defined for Dev only.
![](../../users/profiles/449856.webp)
- 51,224
- 10
- 90
- 127
-
That is super sweet. I had no idea you could do logic in the route file. – Andrei Taranchenko Jul 15 '11 at 14:43
-
I knew you could do some logic, as it was a solution to the war context problem, but wasn't sure how much logic was possible. So I tried it, and it worked! – Codemwnci Jul 15 '11 at 14:59
-
You can also use groovy if tags for example `#{ if (play.mode.isDev()) } SOME ROUTE #{/if}` if you want to end if yourself. :) – Umut Benzer Aug 05 '12 at 18:30
-
Just to reinforce @kheraud's comment above: this doesn't work in Play 2. – Michael Iles Sep 30 '14 at 16:43
For play framework version 2.x:
- You need to have another
routes
file lets sayprod.routes
in the root of your application (same directoy of originalroutes
file), this file contains only the routes that you want for production. - Then you create another
.conf
file likeprod.conf
insideconf
folder. - Now this new conf file must contain the following:
for the play framework 2.4 and newer :
include "application.conf"
play.http.router=prod.Routes
Or without new .conf
file pass parameter:
-Dplay.http.router=prod.Routes
And if older than 2.4 then :
include "application.conf"
application.router=prod.Routes
And when you run the production run it with -Dconfig.file=prod.conf
![](../../users/profiles/765965.webp)
- 6,611
- 6
- 65
- 93