【问题标题】:Play Framework 2.4 don't accept "public static Result" for controllersPlay Framework 2.4 不接受控制器的“公共静态结果”
【发布时间】:2016-04-05 18:00:28
【问题描述】:

我尝试在 Mac 中使用 Play Framework 2.4 和 JDK8 启动应用程序,当我使用 ./activator new Project play-java 下载基础时,模板代码包含下一个:

项目/app/controlles/Application.java

package controllers;

import play.*;
import play.mvc.*;

import views.html.*;

public class Application extends Controller {

    public Result index() {
        return ok(index.render("Your new application is ready."));
    }

}

但是当我更换这部分时:

public static Result index() {...

将“静态”添加到 index()

我收到此错误

Compilation error
value index is not a member of controllers.Application
.../conf/routes:6
4 # ~~~~
5 # Home page
6 GET     /                           controllers.Application.index()

我不知道为什么,因为在所有示例中,结果都使用静态

【问题讨论】:

  • 你知道static在OOP语言中的含义吗?显然基类的index 成员(字段,而不是方法)是实例成员,因此不能静态访问。
  • @Kryptos:你想说什么? index() 在此处不以任何方式访问,无论是静态的还是非静态的。原因是 Play 从 2.4 版本开始切换到非静态操作方法。
  • @Kris,你把index 误认为index()
  • @Kryptos:Controller中既没有索引也没有index()

标签: java playframework


【解决方案1】:

您可能仍在使用旧式路由。

来自documentation

注入路由生成器 默认情况下,Play 将生成一个静态路由器,它假定所有操作都是静态方法。通过将 Play 配置为使用注入路由生成器,您可以让 Play 生成一个路由器,该路由器将其路由到的所有控制器声明为依赖项,从而允许您的控制器自己进行依赖注入。

我们建议始终使用注入路由生成器,静态路由生成器主要作为一种工具来帮助迁移,这样现有项目就不必一次将所有控制器设为非静态。

要启用注入路由生成器,请将以下内容添加到 build.sbt 中的构建设置中:

routesGenerator := InjectedRoutesGenerator

或者,您可以坚持使用静态路由器(但如果您要创建一个新应用,为什么要这样做?)并在操作引用前加上 @

GET        /some/path        @controllers.Application.index()

【讨论】:

  • 在我的代码中,控制器中的索引方法是非静态的,但我的应用程序仍在工作。如何从类名中调用非静态方法。
  • 您在routes 文件中写入的内容不是对方法的调用。 routes 实际上是一个 Scala DSL 并被编译。需要时,将在命名类的实例上调用命名方法。
  • stackoverflow.com/questions/41918001/…你能回答这个问题吗?
【解决方案2】:

在 Play 2.5 中默认使用注入路由。如果您仍想使用静态路由,请将其添加到您的 build.sbt:

routesGenerator := StaticRoutesGenerator

@controllers.… 符号对我不起作用。

更多详情:https://playframework.com/documentation/2.5.x/Migration25#Routes-generated-with-InjectedRoutesGenerator

【讨论】:

    【解决方案3】:

    Play 2.4 将默认路由生成器更改为 InjectedRoutesGenerator 以对路由使用依赖注入。至少 tjhat 是在 play-java 模板中设置的。 如果您仍想使用静态方式,请在 build.sbt 文件中注释以下行

    // Play provides two styles of routers, one expects its actions to be injected, the
    // other, legacy style, accesses its actions statically.
    //routesGenerator := InjectedRoutesGenerator
    

    详见https://www.playframework.com/documentation/2.4.x/Migration24指南>依赖注入>路由

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-25
      • 2015-11-10
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多