Reputation: 5200
We're in the progress of upgrading to play 2.5.5 from play 2.4.x. We have a pretty large amount of controllers that are objects, like so:
object TranslationsController extends Controller { ... }
However, since switching to 2.5, we now get hundreds of errors like this (it's a pretty huge project):
type TranslationsController is not a member of package controllers
Is there a way to still allow some/most our Controllers to be object and not class? I realize this has everything to do with dependency injection. But a pretty large percentage of the controllers, has no dependencies.
Of course, we could rewrite it like so just to make it compile:
class TranslationsController @Inject () extends Controller { ... }
but that's really pointless?? An immutable class/object that takes no
parameters, should be an object. It's like case class None()
vs case
object None
. Of course the latter should be the preferred one in every case.
The big deal here is that we can't just string replace object->class
either, because we have a lot (~1000) of tests that assumes these
controllers to be objects. To make it work with class, we would have to
rewrite all those tests to first do a val controller =
new TranslationsController
, first, which is a lot of work (and tons of
boilerplate).
I would really appreciate if there was some way to still use object. Is
there some syntax for it in the .routes
files, or is there an easy
workaround? I mean, once there are dependencies to these controllers, we'll
make them classes, but to do that to 100 controllers in one go without any
benefit is pretty painful.
Upvotes: 0
Views: 347
Reputation: 12986
You should be able to keep those controllers if you tell Play to use the old routes generator. In your build.sbt
put:
routesGenerator := StaticRoutesGenerator
and reload your project
Upvotes: 1