【问题标题】:PlayFramework 2.5 Templates - Twirl Dependency InjectionPlayFramework 2.5 模板 - Twirl 依赖注入
【发布时间】:2017-01-16 01:18:05
【问题描述】:

由于 PlayFramework 像一年一样使用依赖注入从全局状态移动,并且可能没有人能够在那里重写指南/教程,所以我无法在任何地方找到我的问题的答案。

从 Play 2.5 开始,即使在旋转模板中,您也必须远离全局状态。 然后例如:您想在模板中使用 WebJarAssets,那么您必须按照本指南使用 (http://www.webjars.org/documentation):

Java 中的控制器:

public class Application extends Controller {

    @Inject WebJarAssets webJarAssets;

    public Result index() {
        return ok(index.render(webJarAssets));
    }

}

和模板:

@(webJarAssets: WebJarAssets)
<!DOCTYPE html>
<html>
    <head>
        <link rel='stylesheet' href='@routes.WebJarAssets.at(webJarAssets.locate("css/bootstrap.min.css"))'>
    </head>
    <body>
    </body>
</html>

好的,这是有道理的,而且很容易做到。但是您的模板通常有不止一个参数,现在有 MeesageApi,您可能还想在模板和任何其他中使用它。然后在 Java 中,您必须将所有内容作为参数传递,您的模板将有数千个参数,并且将是难以阅读和管理。现在,如果您从 Play2.4 等旧版本或更少版本迁移,您可能需要为您制作的每个模板以及每个控制器编辑参数,如果您的项目真的很大,这将是很多不必要的工作..

所以模板中也应该有可用的 DI。这个问题应该已经在这里解决了:Injectable templates

所以我按照那里写的内容添加到plugins.sbt:

addSbtPlugin("com.typesafe.sbt" % "sbt-twirl" % "1.2.0")

添加到 build.sbt:

TwirlKeys.constructorAnnotations += "@javax.inject.Inject()"

我也有如下解析器:

resolvers += Resolver.sonatypeRepo("snapshots")

然后我将DI添加到旋转模板:

@import play.twirl.api.HtmlFormat
@import b3.vertical.fieldConstructor
@import views.html.menu.menu
@import controllers.WebJarAssets
@(title: String)(implicit headInsert: Html = HtmlFormat.empty, content: Html = HtmlFormat.empty)

@this(webJarAssets: WebJarAssets) 

重新开始播放,我仍然收到错误:

play.sbt.PlayExceptions$CompilationException: Compilation error[not found: value webJarAssets]

我错过了什么?我还应该在控制器内注入一些东西吗? 是否有任何地方使用 DI 的 play 应用示例?

【问题讨论】:

  • 我认为您还必须在控制器中注入视图。否则模板将不会被 DI 框架处理。请参阅问题末尾的评论如何在 java 中执行此操作:github.com/playframework/twirl/pull/100#issuecomment-265736004 此外,您可能需要检查是否必须将 @this() 放在 @(params) 之前。
  • 谢谢,实际上@this() 必须放在@params 之前
  • 太好了,你解决了它。我会将其添加为答案,以便您接受它以帮助遇到相同问题的其他人。

标签: java templates dependency-injection playframework twirl


【解决方案1】:

构造函数调用@this() 与依赖注入值和渲染模板参数的顺序很重要。您应该将@this() 放在常规模板参数之前。

@import play.twirl.api.HtmlFormat
@import b3.vertical.fieldConstructor
@import views.html.menu.menu
@import controllers.WebJarAssets

@this(webJarAssets: WebJarAssets)

@(title: String)(implicit headInsert: Html = HtmlFormat.empty, content: Html = HtmlFormat.empty)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 2016-10-27
    • 2018-06-17
    相关资源
    最近更新 更多