0

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]
    ...
}

我尝试过的事情

  1. 上面的代码。不能super与惰性 val 一起使用。
  2. 更改httpFiltersdef. 由于 BuiltInComponents 需要是一个稳定的值
  3. 添加lazy val httpFilters = filtersdef filters: Seq[EssentialFilter] = ...然后filters根据需要覆盖。Macwire 抱怨模棱两可的类型。

我可以做些什么来实现可选附加的过滤器列表?

4

1 回答 1

0

我可能不明白你的情况,但简单有什么问题

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似乎被设计为被覆盖的基础。

于 2017-12-21T18:26:26.903 回答