【发布时间】:2015-09-29 08:35:53
【问题描述】:
我正在查看 play-mailer 中的鳞状代码示例:https://github.com/playframework/play-mailer
基本上是这样的:
class MyComponent @Inject() (mailerClient: MailerClient) {
...
}
足够简单,编译时不兼容
然后我尝试“调用”它,但似乎没有一种方法可以满足编译器或获取 mailerClient 的工作实例。
object AnObject {
val mailer = new MyComponent
def sendEmail = mailer.doStuff
}
[info] Compiling 1 Scala source to ...
[error] /SomeOne/SomePath/SomeFile.scala:30: not enough arguments for constructor MyComponent: (mailerClient: play.api.libs.mailer.MailerClient) MyComponent.
[error] Unspecified value parameter mailerClient.
[error] val mailer = new MyComponent
[error] ^
[error] one error found
[error] (compile:compileIncremental) Compilation failed
虽然我可能会因为这个而接近:
How does @Inject in Scala work
这表明以下语法可以通过从构造函数中删除 @Inject 并将其放在字段上来工作。
@Inject var mailerClient: MailerClient = null
但是,当我们尝试运行任何需要该引用的东西时,我们仍然会得到 null。
我正在阅读我在@Inject 上可以找到的所有内容
( [警告] [咆哮] 由于这个确切的原因,我不喜欢这样的编译器魔法——巫术魔法非常棒,直到它停止工作,然后似乎没有人知道如何修复它。[/rant] [/warning] )
但我真正想知道的是如何正确、安全、有效地使用它。
【问题讨论】:
-
仅供参考 - 这可能对那些只想让电子邮件正常工作的人有所帮助...github.com/playframework/play-mailer/blob/master/src/test/scala/…
标签: scala playframework annotations inject