com.lightbend.lagom.scaladsl.api.transport.HeaderFilter acess to play.api.Config

scala

(Fernando Hackbart) #1

Hello, I need to get some application.conf parameters in the HeaderFilter I had implemented using HeaderFilters and I tried to inject Configuration (play.api.Configuration) in my header filter implementation and also use it as implicit without success. Is there a way to properly have the Play configuration available in the header filter?


(Fernando Hackbart) #2

play.api.Configuration is deprecated…


(Renato) #3

I guess you can do the following.

class MyFilter(config: Config) extends HeaderFilter {
  // use config here
}

trait Service {
  def config: Config

  def descriptor = {
    named("hello").withCalls(
      call(sayHello)
    ).withHeaderFilter(HeaderFilter.composite(
      new MyFilter(config)
   ))
 }
}

class ServiceImpl(val config: Config) extends Service

When you wire ServiceImpl with macwire, you get Config injected for you and it will be passed to MyFilter.


(Fernando Hackbart) #4

Hello, I created one simple project to test the case header-filter-config, when defining a unit in the API definition the project compilation fails with the error:

Can't generate a Lagom client for my.lagom.issue.api.HeaderFilterService since the following abstract methods don't return service calls or topics: config

It seems that any def in the Service API definition should return a call or topic…


(Fernando Hackbart) #5

Even though trying to create a parameter in the HeaderFilter (moving from object to class) I receive in the API

[info] Compiling 1 Scala source to /home/fernando.hackbart/Documents/Projects/SPMS/poc/xxx/header-filter-config/header-filter-api/target/scala-2.12/classes ...
[error] /home/fernando.hackbart/Projects/header-filter-config/header-filter-api/src/main/scala/my/lagom/issue/api/HeaderFilterService.scala:19:45: my.lagom.issue.code.MyConfigHeaderFilter.type does not take parameters
[error]       .withHeaderFilter(MyConfigHeaderFilter(config))
[error]                                             ^
[error] one error found
[error] (header-filter-api / Compile / compileIncremental) Compilation failed

I have a class with parameter and an object without parameter and it tries to use the object always, I think I should have to inject the configuration in the object somehow…


(Tim Moore) #6

I’m afraid that there isn’t a good way to inject configuration into a header filter (see https://github.com/lagom/lagom/issues/1072). Header filters are mostly useful for mechanical transformations of the headers.

Depending on what you’re trying to do, it might be more appropriate to use a Play filter, or service call composition.


(Fernando Hackbart) #7

What I am trying to do is to make available a public certificate to validate a signed JWT token… As I am running on Kubernetes the certificate is available as a secret and I planning to have it available using the application.conf. For now I am doing a dirty System.getEnv(). I am not even sure the application.conf way is the best way…


(Tim Moore) #8

That sounds like a good use case for service call composition. This will allow you to pass the validated data from the token through to the service call method itself where you can use it in your business logic.


(Fernando Hackbart) #9

I see, I will split the logic to, in the header filter ensure that the JWT token is present in the request and then validate and extract the token content in the composition.

Thank you