How to run httpFilters in playframework 2.4

228 Views Asked by At

I am trying to build application on Playframework 2.4 with macwire DI, and I have problem with httpFilters from Play ! Here is an example what I'm trying to do

class ExampleFilter extends Filter {
  def apply(nextFilter: RequestHeader => Future[Result])
           (requestHeader: RequestHeader): Future[Result] = {
    nextFilter(requestHeader).map { result =>
      result.withHeaders("Example" -> "test")
    }
  }
}

class Filters(ex:ExampleFilter) extends HttpFilters {
  val filters = Seq(ex)
}

DI module

trait Module extends EhCacheComponents with BuiltInComponents {

  lazy val exampleFilter = wire[ExampleFilter]
  lazy val filters = wire[Filters]

Loader class

class Loader extends ApplicationLoader {
  def load(context: Context) = {
    new MyComponents(context).application
  }
}

class MyComponents(context: Context) extends BuiltInComponentsFromContext(context) with Module {
  lazy val router: Router = wire[Routes] withPrefix "/"
}

part of application.conf is

play.http.filters = Filters

and ExampleFilter doesn't work. I'm getting response without "Example" header

2

There are 2 best solutions below

0
On

It looks like your Filters is in the unnamed (default) package. Put it somewhere in the package, like appfilters.Filters.

So

package appfilters

...

class Filters(ex:ExampleFilter) extends HttpFilters {

...

and

play.http.filters = appfilters.Filters 
0
On

it looks like that I have found the solution

class MyComponents(context: Context) extends BuiltInComponentsFromContext(context) with Module {
  override lazy val httpFilters = Seq(ExampleFilter)
  lazy val router: Router = wire[Routes] withPrefix "/"
}

, just override httpFilters from BuiltInComponents trait (like above), and change ExampleFilter to object and it works