Play框架:如何更改Play默认包?

34

我想知道是否可以更改Play的默认包。例如:我想将"controllers"包更改为"com.test.controllers"。我不知道这是否有意义,但我只是想知道是否可能。我在Play官网上没有找到相关信息。

5个回答

21
根据当前的Play 2.0文档,现在可以这样做:

请注意,在Play 2.0中,控制器,模型和视图包名称约定只是约定俗成的,如果需要可以更改(例如,使用com.yourcompany为前缀)。

对于空的Play应用程序,这很有效,但是对于其他内容需要注意以下几点:
  1. 将自定义命名空间导入视图模板将适用于除在模板的第一行声明的类型之外的任何类型,这些类型是生成出视图的scala render函数的参数。我们的解决方法是在视图模板的第一行添加完整的包名称来声明类型。
  2. 对于路由文件中定义的每个命名空间(例如,自定义包和默认的Assets路由包),Play 2.0会在相同的命名空间中生成一个相应的路由源文件,因此需要确保在执行重定向等操作时正确地处理文件。

我在理解第二点时遇到了一些困难 - 假设我们从默认包移动到foo.bar包,那么视图中的任何远程路由都需要从routes.Application.method更改为foo.bar.controllers.Application.method。 - Mark Butler
3
假设您有一个名为 MyController 的控制器,其中包含一个名为 myMethod 的处理方法。如果您将其从“controllers”包移动到“com.example.controllers”中,则需要(1)在Scala模板中将@routes.MyController.myMethod()更改为@com.example.controllers.routes.MyController.myMethod(),并且(2)在控制器类本身中,将其进行的任何重定向(例如,在提交表单后)从controllers.routes.MyController.someMethod()更改为com.example.controllers.routes.MyController.someMethod()。 - Andrew Swan
那么我现在使用的是2.4.x版本 - 我该如何在包名前加上com.yourcompany呢?我的appconfpublictest都在com/yourcompany下,但sbt似乎无法编译这些文件夹中的任何.java文件。我找不到任何相关文档。 - ronaldwidha
2
@ronaldwidha,你现在可能已经明白了,但如果你想为你的视图创建命名空间,例如,创建一个目录:apps/com/yourcompany/views,然后像com.yourcompany.views这样引用视图。 - Jamie

13

来自手册

一个控制器类必须定义在controllers包中,并且必须是play.mvc.Controller的子类。

如果未直接在控制器包下定义,您可以在控制器类名之前添加Java包。默认情况下,controllers包是隐式的,因此您不需要指定它。

这意味着您无法将controllers包更改为com.test.controllers(因为根包必须是controllers),但您可以更改为controllers.com.test


7

更新以清晰区分play1和2。

对于Play 1.x,这是不可能的。

不,所有控制器必须在一个包或控制器的子包中。如果您想保持 com.test 包结构,可以使用 controllers.com.test

有关更多信息,请参见此线程

对于Play2.x,这是可能的。只需将所有内容移动到所需的包中。确保最外层的app/目录保持在外面。例如:play-project/app/com.company/controllers

因此简单的答案是...它取决于您使用的Play版本。


正如其他答案所指出的那样(以防人们产生错误的想法),这种情况已经不再存在。 - Andrew Swan
1
并不是那么简单。Play 2确实允许这样做,但是当前版本的Play 1不支持。我之所以要区分Play 1和Play 2,是因为它们是非常不同的框架,升级并不是一条简单的路径。 - Codemwnci

1
有关此问题的讨论请点击这里
在常见问题解答中还有这个

请添加描述而不仅仅是链接。链接会失效。请参见https://meta.stackexchange.com/questions/144566/new-policy-on-link-only-answers - David J.

0

虽然回答晚了,但对于那些在2022年遇到相同情况的人来说,这是可能的,使用Play 2.8.x Scala文档,但也适用于Java

您可以定义自己的自定义包com.test.controllers(甚至可以在根目录App文件夹中定义)。 然后需要为其类定义路由以匹配反向路由,如文档所述

例如,如果您定义了一个类foo.java,它具有可在端点/index上访问的方法index,则您的路由文件必须像这样反映它:

GET /index  com.test.controllers.foo.index

你可以使用助手(反向路由)从HTML文件中访问它,如下所示:

@com.test.controllers.routes.foo.index()

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