Guice unable to create injector for Singletons depending on Configuration or Environment (Redux)
Closed this issue · 8 comments
Referencing #19, unfortunately the solutions provided aren't sufficient / elegant in the case of a singleton that has expensive initialization. Not all singletons can/should be lazily initialized.
Isn't there a better way to tie into the dropwizard initialization cycle which will solve this?
Agreed. Why don't you give it a try and report back? Funny enough, I'm moving to Governator and everything is working really well. Finally in Stage.PRODUCTION
! but don't have the issue you describe. FYI, I usually add an expensive initialization as part of my healthcheck because I like to warm up the JVM before adding it to my load balancers.
So you want it to be an eager singleton that has access to Environment
/Configuration
? As @chbatey noted on #19 this can be achieved by moving injector creation to the run method, but at the expense of not being able to autoconfig bundles which some users might rely on.
One possible workaround is to make the singleton lazy and have a managed that initializes it inside the start method (or a healthcheck as @eliast suggested), so you effectively get an eager singleton
I'm trying the lazy healthcheck approach. Your updated documentation for #41 helps; it didn't occur to me that it's safe to hold a reference to the GuiceBundle in the application class to make it visible to the run method (I was experimenting with the container, which the environment can return).
Nevertheless there seems to be a square peg and round hole here; is there any way to smooth the edges?
Could you also provide a documentation example for chbatey's approach? (It sounds like he made a pull request, which may be worth looking at.) Specifically, how do you register the bundle given that you don't have a handle on bootstrap in the run method?
Thanks
Agreed on the square peg. But there are all kinds of gotchas and nobody has submitted a PR request that actually solves it yet. ;-) Basically, if we want to support bundle injection then we have to create the injector in initialize, else we could initialize the injector during the run phase and everything would be good.
If we keep it this way, we can do everything, we just need to know the exact steps to follow. Not very ideal but works.
I got this working using autoconfig + healthchecks.
Theoretically, what would dropwizard need to support to make this more seamless? I.e. what might a possible pull request for dropwizard 0.8 contain that would allow first class guice support?
@flavor8 dropwizard uses Jersey which has HK2 built in as injector. Therefore by default, Guice will be an add-on instead of being first class. I'm experimenting with the HK2 Guice Bridge at the moment to see if Guice can work with dropwizard 0.8
Any update on this issue?
Since this issue was opened we have introduced dropwizard-guicier which creates the Guice injector during the run phase which solves the problems with eager singletons:
https://github.com/HubSpot/dropwizard-guicier