为 play framework 2.6 配置的默认控制器包在哪里?
Posted
技术标签:
【中文标题】为 play framework 2.6 配置的默认控制器包在哪里?【英文标题】:Where is the default controllers package configured for play framework 2.6? 【发布时间】:2018-02-07 11:02:25 【问题描述】:我正在重新向自己介绍 Play Framework,并且有一段时间没有接触它,重新熟悉了重要的基础知识。我目前正在研究 Java,但这个问题确实与 Java 或 Scala 无关。 我正在使用 Play Framework 2.6.11 版
我想更好地了解控制器是如何设置的;即,更准确地说,是什么将“控制器”包指定为应放置控制器的默认包。
例如,第一个可以运行的入门示例会看到这样的目录结构:
app/controllers
app/views
app/services
控制器包中有一个Java文件:
CountController.java
路由文件显示一个条目:
GET /count controllers.CountController.count
在文件welcome.scala.html(在views包中)可以找到一个动态链接,代码如下:
@routes.CountController.count
它引用了目标中路由类中的一个成员。
正如人们所注意到的,来自视图的引用似乎不需要完全限定该方法。即,对于“@routes.CountController.count”,控制器包似乎是隐含的。
所以我问自己的第一个问题是:这是硬编码的地方吗?这只是约定俗成的,有没有办法改变或扩展呢?
翻遍文档,我发现很难找到任何相关信息。
所以,为了发现更多信息,我尝试创建一个自定义包。
我在与控制器、视图、服务等相同的级别上创建, 一个包“altcont”并在其中放置一个控制器类“HelloWorld.java”。
我在路由文件中创建一个条目:
GET /helloWorld altcont.HelloWorld.greeting
我尝试从其他页面之一引用它;首先是这样的:
"@routes.HelloWorld.greeting"
这不起作用。
好的。因此,在任意包中发现控制器并没有什么神奇的方法,它也不会以某种方式从路由文件中解析完全限定的类名来发现它。它根本找不到它。美好的。所以我试试这个:
"@altcont.routes.HelloWorld.greeting"
成功了!!!
太好了。好的,所以我明白了一点。然而,它仍然意味着
在某个地方,有一些东西告诉 play,如果一个包没有被指定为首先在控制器包中查找。
我之前的说法正确吗? 这是可配置的吗? 这是硬编码的约定吗? 我在哪里可以找到此文档?
谢谢!
【问题讨论】:
【参考方案1】:我想更好地了解控制器是如何设置的;即,更准确地说,是什么将“控制器”包指定为应放置控制器的默认包。
这只是一个约定,仅此而已。所以,如果你想把你的控制器放在com.mycompany.controllers
里面,你就可以走了。当然,您需要考虑代码生成方面,例如反向路由。但这无论如何都不是问题。
正如人们所注意到的,来自视图的引用似乎不需要完全限定该方法。即,对于“@routes.CountController.count”,控制器包似乎是隐含的。
这是因为@routes.CountController.count
来自反向路由器。完全限定名称是 controllers.routes.CountController
,但默认情况下,controllers._
已在每个视图中导入。
如果你想使用像com.mycompany.controllers
这样的包,那么反向路由器将是com.mycompany.controllers.routes.MyController.myAction
。
太好了。好的,所以我明白了一点。然而,它仍然意味着
在某个地方,如果没有指定包在控制器包中首先查找,则有一些东西告诉 play。
没有这样的事情。它们只是常规包中的常规类。正如您已经注意到的,反向路由器生成给出了更强的约定。
【讨论】:
"但是 controllers._ 已经在每个视图中默认导入。"啊,这就解释了。谢谢!以上是关于为 play framework 2.6 配置的默认控制器包在哪里?的主要内容,如果未能解决你的问题,请参考以下文章
Java Play Framework 2.6 不返回“Access-Control-Allow-Origin”CORS 标头
Scala Play Framework 2.6密封特征格式给Json