PlayFramework 2.5 模板 - Twirl 依赖注入
PlayFramework 2.5 Templates - Twirl Dependency Injection
因为 PlayFramework 正在使用依赖注入从全局状态移动,并且 none 可能能够在那里重写 guides/tutorials 我无法在任何地方找到我的问题的答案。
从 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 和 less)迁移,您可能需要为您制作的每个模板编辑参数,然后还需要为每个控制器编辑参数,如果您的项目真的很大,那么这是很多不必要的工作..
所以模板中也应该有 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 添加到 twirl 模板中:
@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 的播放应用程序的例子?
构造函数调用的顺序 @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)
因为 PlayFramework 正在使用依赖注入从全局状态移动,并且 none 可能能够在那里重写 guides/tutorials 我无法在任何地方找到我的问题的答案。
从 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 和 less)迁移,您可能需要为您制作的每个模板编辑参数,然后还需要为每个控制器编辑参数,如果您的项目真的很大,那么这是很多不必要的工作..
所以模板中也应该有 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 添加到 twirl 模板中:
@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 的播放应用程序的例子?
构造函数调用的顺序 @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)