Play web框架允许注入“筛选器”列表来对请求(gzip、cors、日志记录等)执行通用处理。
package play.api
trait BuiltInComponents {
...
lazy val httpFilters: Seq[EssentialFilter] = Nil
<stuff that uses httpFilters>
...
}我希望有一套共同的这些过滤器(和其他东西)。
package example
import play.api.BuildInComponents
trait MyCommonComponents extends BuiltInComponents {
...
override lazy val filters = Seq(
wire[Filter1],
wire[Filter2],
wire[Filter3]
)
...
}可由子类使用的
package example.foo
import example.MyCommonComponents
trait MyFooComponents extends MyCommonComponents {
...
}或添加到子类中
package example.bar
import example.MyCommonComponents
trait MyBarComponents extends MyCommonComponents {
...
override lazy val filters = super.filters :+ wire[Filter4]
...
}我试过的东西
super。httpFilters改为def。由于BuiltInComponents需要一个稳定的值lazy val httpFilters = filters和def filters: Seq[EssentialFilter] = ...,然后酌情重写filters。Macwire抱怨类型不明确。我能做些什么来实现可选附加的过滤器列表?
发布于 2017-12-21 18:26:26
我可能不明白你的情况,但简单的怎么了
import com.softwaremill.macwire._
import play.api.BuiltInComponents
import play.api.mvc.{EssentialAction, EssentialFilter}
class Filter1 extends EssentialFilter {
override def apply(next: EssentialAction) = next
}
class Filter2 extends EssentialFilter {
override def apply(next: EssentialAction) = next
}
class Filter3 extends EssentialFilter {
override def apply(next: EssentialAction) = next
}
trait MyCommonComponents extends BuiltInComponents {
protected lazy val baseFilters: Seq[EssentialFilter] = Seq(
wire[Filter1],
wire[Filter2],
)
override def httpFilters = baseFilters
}
trait MyFooComponents extends MyCommonComponents {
protected lazy val fooFilters = baseFilters :+ wire[Filter3]
override def httpFilters = fooFilters
}或者这个
trait MyBarComponents extends MyCommonComponents {
private lazy val barFilters = Seq[EssentialFilter](wire[Filter3])
override def httpFilters = super.httpFilters ++ barFilters
}为什么要重写您的lazy val而不是设计为要重写的基本httpFilters。
https://stackoverflow.com/questions/47929367
复制相似问题