【问题标题】:After upgrade to play 2.5 : Error injecting constructor升级到玩 2.5 后:注入构造函数时出错
【发布时间】:2016-04-25 08:30:36
【问题描述】:

我刚刚更新到 Play 2.5.2,我的过滤器(在登录时运行)给了我以下错误:

ProvisionException: Unable to provision, see the following errors:

1) Error injecting constructor, java.lang.RuntimeException: There is no started application
  at filters.LoginFilter.<init>(LoginFilter.scala:15)

我不得不稍微修改我的代码以匹配 2.5.2 设置为过滤器的新更改:

import akka.stream.Materializer
import com.google.inject.Inject
import play.api.Play._
import play.api.cache.CacheApi
import play.api.mvc.Results._
import play.api.mvc.{Filter, RequestHeader, Result}

import scala.concurrent.{ExecutionContext, Future}

class LoginFilter @Inject() (implicit val mat: Materializer, ec: ExecutionContext) extends Filter {
}

我必须使用 Materializer 添加 @Inject 否则我会收到一条错误消息,指出该类应该是抽象的或应该实现 Materializer。

我该如何解决这个问题?谢谢!

【问题讨论】:

  • 您的代码中的某些内容似乎需要一个正在运行的应用程序。通常的嫌疑人是 Play.current、Play.configuration 等。您可能必须显示整个过滤器类以及可能更多的堆栈跟踪。另外,第 15 行是哪几行?
  • 有什么问题?似乎使用 DI 为您修复了它?
  • 我也有同样的问题,但是用GzipFilter 代替。我想知道问题是否是已弃用的object 控制器之一(而不是带有class .. @Inject().... 的新控制器)导致在应用程序启动之前过早创建过滤器。转换为class ... @Inject() 可以解决这个问题。 ——你找到解决办法了吗?

标签: scala playframework


【解决方案1】:

我实际上不确定这个,老实说我不知道​​有什么区别,但在我所有的文件中都有 javax.inject 而不是谷歌注入,所以它可能值得一试。

代替:

import com.google.inject.Inject

试试:

import javax.inject.Inject

【讨论】:

  • 无论您是使用 Google 的注解还是 javax 的注解,只要您坚持使用 guice,都无关紧要。为了使您的代码有点独立于 DI 容器,您可能希望使用 javax 代码。
猜你喜欢
  • 2019-05-25
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
相关资源
最近更新 更多