Playframework路由文件:将生产路由与开发路由分离

25

在Play框架中,有没有一种方法可以使用注解路由来表明某个部分/组路由仅在开发模式或生产模式下可用?

2个回答

37

好的,这并没有被记录在文档中,所以我不确定这是否是有意进行的或者是不是可以这样做,但是我已经找到了一种方法来使它起作用。请注意,因为这是未记录的功能,可能意味着它是无意的,因此在未来版本的play中可能会出现问题。

您可以在路由文件中使用以下行来实现您想要的目标。

%{ if (play.mode.isDev()) }%

我创建了一个测试应用程序,其中包含几个操作。

public class Application extends Controller {

    public static void index() {
        render();
    }

    public static void noDev() {
        renderText("NoDev");
    }
    public static void noProd() {
        renderText("NoProd");
    }
}

我随后在我的路由文件中添加了以下内容

# 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}

所以,您可以看到使用简单的if语句,它只会在该模式下执行下一组路由。当找到下一个if语句时,if语句将结束。

如果在开发模式下尝试访问route4,则无法访问它,并且您将看到RouteNotFound页面,显示仅可用于开发的那些路由。


那太棒了。我不知道你可以在路由文件中进行逻辑操作。 - Andrei Taranchenko
我知道你可以做一些逻辑,因为这是解决战争背景问题的一个方案,但不确定有多少逻辑是可能的。所以我尝试了一下,结果它起作用了! - Codemwnci
如果你想自己结束if,你也可以使用Groovy的if标签,例如#{ if (play.mode.isDev()) } SOME ROUTE #{/if}。 :) - Umut Benzer
只是为了强调@kheraud上面的评论:这在Play 2中不起作用。 - Michael Iles

2

适用于 Play Framework 2.x 版本:

  • 您需要在应用程序的根目录(与原始 routes 文件相同的目录)中创建另一个名为 prod.routesroutes 文件,该文件仅包含您要用于生产环境的路由。
  • 然后在 conf 文件夹中创建另一个名为 prod.conf.conf 文件。
  • 现在,这个新的配置文件必须包含以下内容:

适用于 Play Framework 2.4 及更高版本:

include "application.conf"

play.http.router=prod.Routes

如果不使用新的.conf文件,则可以通过传递参数进行设置:

-Dplay.http.router=prod.Routes

如果版本低于2.4,则:

include "application.conf"

application.router=prod.Routes

当您运行生产环境时,请使用-Dconfig.file=prod.conf参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接