Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set up play framework ApplicationLoader and Macwire to work with custom routes?

I set up the application loader this way:

class MyProjectApplicationLoader extends ApplicationLoader {
  def load(context: Context): Application = new ApplicationComponents(context).application
}

class ApplicationComponents(context: Context) extends BuiltInComponentsFromContext(context)
  with QAControllerModule
  with play.filters.HttpFiltersComponents {

  // set up logger
  LoggerConfigurator(context.environment.classLoader).foreach {
    _.configure(context.environment, context.initialConfiguration, Map.empty)
  }

  lazy val router: Router = {
    // add the prefix string in local scope for the Routes constructor
    val prefix: String = "/"
    wire[Routes]
  }
}

but my routes is custom, so it looks like:

the routes file:

-> /myApi/v1 v1.Routes
-> /MyHealthcheck HealthCheck.Routes

and my v1.Routes file:

GET    /getData    controllers.MyController.getData

so now when I compile the project I get this error:

Error: Cannot find a value of type: [v1.Routes] wire[Routes]

so im not sure how to fix this, does someone know how can I make the loader to work with this structure of routes?

like image 369
JohnBigs Avatar asked Jul 04 '17 18:07

JohnBigs


2 Answers

The answer by @marcospereira is correct, but maybe the code is slightly wrong.

The error is due to the routes file referencing v1.routes - this is compiled to a Routes class having a parameter of type v1.Routes.

You can see the generated code in target/scala-2.12/routes/main/router and /v1.

Hence to wire Router, you need a v1.Router instance. To create a v1.Router instance, you need first to wire it.

Here’s one way to fix the above example:

lazy val router: Router = {
  // add the prefix string in local scope for the Routes constructor
  val prefix: String = "/"
  val v1Routes = wire[v1.Routes]
  wire[Routes]
}
like image 55
adamw Avatar answered Oct 23 '22 06:10

adamw


You also need to wire the v1.Routes. See how it is done manually here:

https://www.playframework.com/documentation/2.6.x/ScalaCompileTimeDependencyInjection#Providing-a-router

This should work as you expect:

lazy val v1Routes = wire[v1.Routes]
lazy val wiredRouter = wire[Routes]

lazy val router = wiredRouter.withPrefix("/my-prefix")

ps.: didn't test it in a real project.

like image 20
marcospereira Avatar answered Oct 23 '22 05:10

marcospereira