好的,我发现了这个问题,但是挖掘问题的根源有点棘手。
当我将 macwire 添加到项目以进行依赖注入时,我必须定义一个自定义应用程序加载器,它需要一个自定义AppComponents
类。我对AppComponents
班级的声明如下所示:
class AppComponents(context: Context)
extends BuiltInComponentsFromContext(context)
with MyModule
with AssetsComponents
with I18nComponents
with play.filters.HttpFiltersComponents
现在很明显,play.filters.HttpFiltersComponents
具有以下字段:
def httpFilters: Seq[EssentialFilter] = Seq(csrfFilter, securityHeadersFilter, allowedHostsFilter)
其中csrfFilter
、securityHeadersFilter
和allowedHostsFilter
是有效的硬编码值。我猜当使用 custom 时ApplicationLoader
,它会忽略application.conf
文件中设置的 http 过滤器(这在我写这篇文章时似乎很明显)。
我正在使用的当前解决方法/修复是设置val httpFilters: Seq[EssentialFilter] = Seq(securityHeadersFilter, allowedHostsFilter)
,而不是默认HttpFiltersComponents
字段。我可能会稍微修改一下以从配置文件中读取过滤器,但现在这解决了问题。
TL;DR:在集成 MacWire 时添加了一个自定义 ApplicationLoader,没有意识到这会影响配置文件中的字段。
编辑
我使用 macwire 配置 HTTP 过滤器的最终代码ApplicationLoader
如下所示,以防其他人需要它。它使用与 几乎完全相同的代码HttpFiltersComponents
,但使用 macwire 而不是 Guice(未定义的变量继承自BuiltInComponentsFromContext
):
override lazy val httpFilters: Seq[EssentialFilter] = {
val wiredInstance: Wired = wiredInModule(this)
val classes: Seq[Class[EssentialFilter]] = {
val disabledFilters = config.get[Seq[String]]("play.filters.disabled")
val enabledFilters = config.get[Seq[String]]("play.filters.enabled").filterNot(disabledFilters.contains)
try {
for (filterClassName <- enabledFilters) yield {
try {
environment.classLoader.loadClass(filterClassName).asInstanceOf[Class[EssentialFilter]]
} catch {
case e: ClassNotFoundException =>
throw configuration.reportError("play.filters.enabled", s"Cannot load class $filterClassName", Some(e))
}
}
} catch {
case e: ConfigException.Null =>
Nil
case e: ConfigException.Missing =>
Nil
}
}
classes.map(x => wiredInstance.wireClassInstance(x))
}